Python多线程与多进程编程详解:概念、创建与实战案例

一只小鹿
一只小鹿
发布时间:2026-10-15 | 4人浏览过
原创

本文深入解析Python中的多进程与多线程编程。详细阐述进程作为资源分配单位、线程作为执行单位的核心概念,演示如何使用multiprocessing和threading模块创建进程与线程,包括参数传递、守护进程设置及同步机制。通过对比两者的优缺点,并结合多任务文件拷贝器的完整代码案例,帮助开发者掌握高并发处理技巧,提升程序执行效率。

进程

进程的基本概念: 进程是操作系统进行资源分配和调度的最小单位,也是系统运行程序的基本载体。通俗来说,正在运行的程序(如QQ、微信等应用)在操作系统中即表现为一个独立的进程。 进程的创建流程如下: 1. 导入进程模块 import multiprocessing 2. 实例化进程对象 进程对象 = multiprocessing.Process() 3. 启动进程以执行指定任务 进程对象.start()


import multiprocessing
import time

def 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 multiprocessing
import time

def 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()

进程的注意点

主进程默认会等待所有子进程执行完毕后才会结束。

可以通过设置daemon=True将子进程设置为守护主进程,即主进程结束后不再等待子进程剩余工作。


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

线程

线程的介绍

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

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

优缺点对比

1. 进程优缺点: 优点:可以利用多核CPU进行并行处理。 缺点:资源开销较大。 2. 线程优缺点: 优点:资源开销较小。 缺点:无法直接利用多核并行(受GIL限制),且依附于进程,一个进程通常对应一个核。

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

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


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 打开源文件和目标文件
    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:
                    break
if __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 os
import threading
def 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:
                    break
if __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多线程编程内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表