您当前的位置:首页 > IT编程 > python
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:深入理解python多线程编程

51自学网 2021-10-30 22:44:23
  python
这篇教程深入理解python多线程编程写得很实用,希望能帮到您。

进程

进程的概念:
进程是资源分配的最小单位,他是操作系统进行资源分配和调度运行的基本单位。通俗理解:一个正在运行的一个程序就是一个进程。例如:正在运行的qq、wechat等,它们都是一个进程。
进程的创建步骤
1.导入进程包
 import multiprocessing
2.通过进程类创建进程对象
 进程对象 = multiprocessing.Process()
3.启动进程执行任务
 进程对象.start()

import multiprocessingimport timedef sing():    for i in range(3):        print("唱歌。。。")        time.sleep(0.5)def dance():    for i in range(3):        print("跳舞。。。")        time.sleep(0.5)if __name__ == '__main__':    time1 = time.time()    s1 = multiprocessing.Process(target=sing)    d1 = multiprocessing.Process(target=dance)    s1.start()    d1.start()    s1.join() #这个方法可以等待子进程结束后再继续往下运行,通常用于进程间的同步    d1.join()    print(time.time()-time1)

带有参数的进程

args元组,kwargs字典

import multiprocessingimport timedef sing(name, num):    for i in range(num):        print("%s在唱歌。。。"%name)        time.sleep(0.5)def dance(num):    for i in range(num):        print("跳舞。。。")        time.sleep(0.5)if __name__ == '__main__':    # 以元组形式传参    s1 = multiprocessing.Process(target=sing, args=('小明', 3))    # 以字典形式传参    d1 = multiprocessing.Process(target=dance, kwargs={"num": 5, })    s1.start()    d1.start()

进程的注意点

主进程会等待所有的子进程执行结束在结束

设置守护主进程

主进程结束后不会再继续执行子进程中剩余的工作work_process = multiprocessing.Process(target=work, daemon=True)

线程

线程的介绍

实现多任务的另一种形式
线程是程序执行的最小单位
同属一个进程的多个线程共享进程所拥有的全部资源

线程的创建步骤
导入线程包
 import threading
通过线程类创建进程对象
 线程对象 = threading.Thread()
启动线程执行任务
 线程对象.start()

优缺点对比

1.进程优缺点:
 优点:可以用多核,可以并行
 缺点:资源开销大
2.线程优缺点:
 优点:资源开销小
 缺点:不可用多核,依附于进程一个进程一个核

案例-多进程实现视频文件夹多任务拷贝器

需求分析:
目标文件夹是否存在,如果不存在就创建,存在则不创建
遍历源文件夹中所有文件,并拷贝到目标文件夹
采用进程实现多任务,并完成拷贝
实现步骤
定义源文件夹所在的路径,目标文件夹所在路径
创建目标文件夹
通过os.listdir获取源目录中的文件列表
遍历每个文件,定义一个函数,专门实现文件拷贝
采用进程实现多任务,完成高并发拷贝

import osimport multiprocessingdef copy_file(file_name, source_dir, dest_dir):    # 1 拼接源文件路径和目标文件路径    source_path = source_dir + '//' + file_name    dest_path = dest_dir + '//' + file_name    # 2 打开源文件和目标文件    with open(source_path, 'rb') as source_file:        with open(dest_path, 'wb') as dest_file:            # 3 循环读取源文件到目标路径            while True:                data = source_file.read(1024)                if data:                    dest_file.write(data)                else:                    breakif __name__ == '__main__':    # 1 定义源文件夹和目标文件夹    source_dir = r'E:/TCT/TIFF_tran/pos_1'    dest_dir= r'F:/目标文件夹'    # 2.创建目标文件夹    try:        os.mkdir(dest_dir)    except:        print("目标文件夹已经存在")    # 3.读取源文件夹的文件列表    file_list = os.listdir(source_dir)    # 4.遍历文件列表实现拷贝    for file_name in file_list:        # copy_file(file_name, source_dir, dest_dir)        # 5.使用多进程实现多任务拷贝        sub_process = multiprocessing.Process(target=copy_file, args=(file_name, source_dir, dest_dir))        sub_process.start()
#线程import osimport threadingdef copy_file(file_name, source_dir, dest_dir):    # 1 拼接源文件路径和目标文件路径    source_path = source_dir + '//' + file_name    dest_path = dest_dir + '//' + file_name    # 2 打开源文件和目标文件    with open(source_path, 'rb') as source_file:        with open(dest_path, 'wb') as dest_file:            # 3 循环读取源文件到目标路径            while True:                data = source_file.read(1024)                if data:                    dest_file.write(data)                else:                    breakif __name__ == '__main__':    # 1 定义源文件夹和目标文件夹    source_dir = r'F:/迅雷下载/视频-智能机器人从0到1系统入门课程/视频'    dest_dir= r'F:/目标文件夹'    # 2.创建目标文件夹    try:        os.mkdir(dest_dir)    except:        print("目标文件夹已经存在")    # 3.读取源文件夹的文件列表    file_list = os.listdir(source_dir)    # 4.遍历文件列表实现拷贝    for file_name in file_list:        # copy_file(file_name, source_dir, dest_dir)        # 5.使用多线程实现多任务拷贝        sub_thread = threading.Thread(target=copy_file, args=(file_name, source_dir, dest_dir))        sub_thread.start()   for file_name in file_list:       sub_thread.join()        sub_thread.join()#主线程等待所有线程结束才会结束

到此这篇关于python多线程编程的文章就介绍到这了,更多相关python多线程编程内容请搜索51zixue.net以前的文章或继续浏览下面的相关文章希望大家以后多多支持51zixue.net!


Python实现文本文件拆分写入到多个文本文件的方法
Python控制台输出俄罗斯方块移动和旋转功能
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。