python 多线程编程

1. 进程概念及作用

        概念:进程是操作系统进行资源分配和调度运行的基本单位

        进程作用:实现多任务同时进行

2.进程的创建

        进程创建有三步:

                1)导入进程包:import  multiprocessing

                2)用进程类创建进程对象:进程对象=multiprocessing.Process(target=任务名)

                3)启动进程:进程对象.start()

        注意:target参数必须传入

参数名说明
target执行的目标任务名,即函数名(方法名)
name进程名,一般不用设置
group进程组,目前只能使用None
"""
创建进程有三步
1. 导入进程包
2. 用进程类创建进程对象
3. 使用进程对象启动进程
"""

# 导入进程包
import multiprocessing

import process  # 自定义的模块

if __name__ == '__main__':
    # 用进程类创建进程对象
    sing_process = multiprocessing.Process(target=process.sing)
    dance_process = multiprocessing.Process(target=process.dance)
    # 启动进程
    sing_process.start()
    dance_process.start()

         带参数的进程使用:

参数名作用
args以元组的方式进行传参
kwargs以字典的方式进行传参
"""
创建进程有三步
1. 导入进程模块
2. 用进程类创建进程对象
3. 使用进程对象启动进程
"""

# 导入进程模块
import multiprocessing

import time
def sing(num, name):
    for i in range(num):
        print(name)
        print('唱歌...')
        time.sleep(1)
def dance(num, name):
    for i in range(num):
        print(name)
        print('跳舞...')
        time.sleep(1)

if __name__ == '__main__':
    # 用进程类创建进程对象
    sing_process = multiprocessing.Process(target=sing, args=(3, 'tom'))  # 多个参数时,会按顺序进行传入
    dance_process = multiprocessing.Process(target=dance, kwargs={'num': 2, 'name': 'amry'})  # 字典中key的值为传入的参数,key的名字要和参数名字一样
    # 启动进程
    sing_process.start()
    dance_process.start()

3.获取进程编号

        需要导入os模块:import os

        获取当前进程的编号:os.getpid()

        获取当前进程父进程的编号:os.getppid()

4.进程守护

        进程中,主进程都会等待子进程结束主进程才会结束,可以在主进程中设置参数进行守护

        参数:进程对象.daemon = True

5.进程案例

        拷贝文件

import os
import multiprocessing

def copy_file(file_name, source_name, dest_name):
    # 拼接源文件路径和目标文件路径
    source_path = source_name + "/" + file_name
    dest_path = dest_name + "/" + file_name
    # 打开源文件和目标文件
    with open(source_path, 'rb') as source_file:  # 自动调用 close() 关闭文件
        with open(dest_path, 'wb') as dest_file:
            # 循环读取源文件到目标文件下
            while True:
                data = source_file.read(1024)
                if data:
                    dest_file.write(data)
                else:
                    break
if __name__ == '__main__':
    # 定义源文件和目标文件
    source_name = "picture"
    dest_name = "picture[拷贝]"
    # 创建目标文件夹
    try:
        os.mkdir(dest_name)
    except:
        print("目标文件夹已经存在")
    # 读取源文件夹的文件列表
    file_list = os.listdir(source_name)  # os.listdir 读取文件中的内容,以列表的形式返回
    # 遍历文件列表实现文件拷贝
    for file_name in file_list:
        # copy_file(file_name, source_name, dest_name)  # 单进程拷贝
        # 使用多进程实现多任务拷贝
        file_copy = multiprocessing.Process(target=copy_file, args=(file_name, source_name, dest_name))
        file_copy.start()

6.线程概念及作用

        概念:线程是程序执行的最小单位,实际上进程只负责分配资源,而利用这些资源执行程序的是线程,也就是说进程是线程的容器,一个进程中最少有一个线程负责执行程序,同时线程不拥有系统资源,只占用进程中的资源,线程可与同一个进程中的其它线程共享全部资源

7.创建线程

        创建线程有三步:

                1)导入线程模块:import  threading

                2)创建线程对象:线程对象 = threading.Thread(target=函数名)

                3)启动线程并执行任务:线程对象.start()

"""
创建线程三步骤
1.导入线程模块
2.创建线程对象
3.启动线程并执行任务
"""
# 1.导入线程模块
import threading

import time

def sing():
    for i in range(3):
        print('唱歌...')
        time.sleep(1)
def dance():
    for i in range(3):
        print('跳舞...')
        time.sleep(1)
if __name__ == '__main__':
    # 2.创建线程对象
    sing_thread = threading.Thread(target=sing)
    dance_thread = threading.Thread(target=dance)
    # 3.启动线程
    sing_thread.start()
    dance_thread.start()

        带参数的线程与进程使用是一样的

8.线程守护

        线程中,主线程会等待所有子线程结束,主线程才会结束,可以在主线程中设置参数进行线程守护

        第一种方式:在创建线程对象时,传递参数 daemon=True

        第二种方式:设置参数 线程对象.setDeamon(True)

           线程的执行顺序是无序

9.进程和线程对比

        关系:1)线程是依附在进程里面的,没有进程就没有线程

                   2)一个进程默认提供一个线程,进程可与创建多个线程

        区别:1)创建进程的开销要比创建线程的开销大

                   2)进程是操作系统分配资源的基本单位,线程是cpu调度的基本单位

                   3)线程不能够独立执行,必须依存在进程中

        优缺点:进程可与使用多核,资源开销大,线程不能够使用多核,资源开销小

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱笑的蛐蛐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值