• Python——多线程编程


    参考资料:
    黑马程序员python多线程编程教程

    1. 概念

    • 多任务:同一时间执行多个任务。
      并发:一段时间交替执行多个任务。
      ②并行:同时一起执行多个任务。

    • 进程:一个正在运行的程序。
      ①操作系统需要为每个进程分配资源。
      ②可创建的进程数量有限。

    • 线程: 是程序执行的最小单元。

    • 对比
      ①关系:线程依附于进程,一个进程可能有多个线程。
      ②区别:创建进程的开销比线程要大,进程是操作系统资源分配的基本单元,线程是CPU调度的基本单位。线程不能独立运行。
      ③优缺点:进程可以用多核,但资源开销大且进程数量有限。线程资源开销小,但不能使用多核。

    2. 多进程完成多任务

    (1)进程创建步骤
    在这里插入图片描述

    • 创建进程对象创建进程时必须指定目标任务名,也就是函数名
      在这里插入图片描述

    (2)进程执行带参数的任务
    在这里插入图片描述

    (3)获得进程编号
    在这里插入图片描述

    (4)注意点

    • 主进程会等待所有子进程执行结束后再结束:主进程并不是不再执行了,而是不会再子进程结束前结束。

    • 设置守护子进程:一旦主进程结束,子进程自动销毁。

    进程对象.daemon = true;
    
    • 1

    3. 多进程实战案例

    (1)需求分析
    实现一个高并发的多任务拷贝器。
    在这里插入图片描述
    (2)代码

    import os
    import multiprocessing
    
    def copy_file(file_name, source_dir, dest_dir):
    	# 1. 拼接文件路径和文件名
        source_path = source_dir + '/' + file_name
        dest_path = dest_dir + '/' + file_name
    	
    	# 2. 循环读取、复制文件
        print(source_path, '--->', dest_path)
        with open(source_path, 'rb') as source_file:
            with open(dest_path, 'wb') as dest_file:
                while True:
                    data = source_file.read(1024)
                    if data:
                        dest_file.write(data)
                    else:
                        break
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    if __name__ == '__main__':
        source_dir = 'python图片'
        dest_dir = 'python图片(复制)'
    
        # 1. 创建文件夹
        try:
            os.mkdir(dest_dir)
        except:
            print('目标文件已存在')
    
        # 2. 读取文件列表
        file_list = os.listdir(source_dir)
        print(file_list)
    
        # 遍历每个文件,专门实现文件拷贝
        for file_name in file_list:
            sub_process = multiprocessing.Process(target=copy_file,
                                                  args=(file_name, source_dir, dest_dir))
            sub_process.start()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    在这里插入图片描述
    在这里插入图片描述

    4. 多线程执行多任务

    (1)创建步骤
    在这里插入图片描述
    在这里插入图片描述
    (2)线程执行带参数的任务
    在这里插入图片描述

    (3)主线程和子线程的执行顺序

    • 主线程会等待所有子线程结束后才能结束
    • 设置守护子线程:一旦主线程结束,子线程自动销毁。
    线程对象.setDaemon = true;
    
    • 1

    (4)线程之间的执行顺序

    • 多线程之间执行是无序的:由cpu调度决定。

    5. 多线程实战案例

    (1)需求分析
    实现一个高并发的多任务拷贝器。
    在这里插入图片描述
    (2)代码

    import os
    import threading
    
    def copy_file(file_name, source_dir, dest_dir):
        source_path = source_dir + '/' + file_name
        dest_path = dest_dir + '/' + file_name
    
        print(source_path, '--->', dest_path)
        with open(source_path, 'rb') as source_file:
            with open(dest_path, 'wb') as dest_file:
                while True:
                    data = source_file.read(1024)
                    if data:
                        dest_file.write(data)
                    else:
                        break
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    if __name__ == '__main__':
        source_dir = 'python图片'
        dest_dir = 'python图片(复制2)'
    
        # 1. 创建文件夹
        try:
            os.mkdir(dest_dir)
        except:
            print('目标文件已存在')
    
        # 2. 读取文件列表
        file_list = os.listdir(source_dir)
        print(file_list)
    
        # 遍历每个文件,专门实现文件拷贝
        for file_name in file_list:
            sub_process = threading.Thread(target=copy_file,
                                          args=(file_name, source_dir, dest_dir))
            sub_process.start()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
  • 相关阅读:
    状态机-----
    金仓数据库 KingbaseGIS 使用手册(6.16. 聚类函数)
    spdlog 封装为 DLL
    Non-zero exit code pycharm
    模电专题-PN结
    windows上修改redis端口号
    .Net平台
    Qt查询mysql表的信息解释
    boost 压缩与解压缩流
    PostgreSQL修炼之道笔记之准备篇(二)
  • 原文地址:https://blog.csdn.net/koulongxin123/article/details/124886746