当前位置: 首页 > news >正文

Python 进阶【二】:多进程编程

一、什么是进程?

  • 进程(Process):操作系统分配资源的最小单位。每个运行中的程序就是一个进程。
  • 线程(Thread):进程内最小的执行单元,可看作轻量级进程。

💡 Python 的多线程受 GIL 限制,在 CPU 密集型任务中难以实现真正的并行。多进程是绕过 GIL、充分利用多核 CPU 的推荐方式。


二、基础用法:multiprocessing.Process

1. 创建进程

from multiprocessing import Process
import os, timedef task():time.sleep(2)print('子进程ID:', os.getpid())if __name__ == '__main__':print('主进程ID:', os.getpid())processes = []for _ in range(10):p = Process(target=task)p.start()processes.append(p)for p in processes:p.join()

2. 常用参数和方法

属性 / 方法说明
target执行函数
args / kwargs传参
start()启动进程
join(timeout)阻塞等待
is_alive()是否仍在运行
terminate()终止进程
daemon设置是否为守护进程
pid / exitcode进程 ID / 退出码

三、进程池:multiprocessing.Pool

1. 创建进程池并提交任务

from multiprocessing import Pool
import timedef task(name):time.sleep(2)print(f"{name} 执行完毕")if __name__ == '__main__':pool = Pool(processes=4)for i in range(6):pool.apply_async(task, args=(f"任务{i}",))  # 非阻塞方式pool.close()pool.join()

2. 方法说明

方法描述
apply()阻塞提交
apply_async()非阻塞提交,支持回调函数
close() / join()关闭进程池 / 等待结束

四、进程间通信

1. 使用 Pipe(管道)

from multiprocessing import Pipe, Processdef send_data(conn, data):conn.send(data)def receive_data(conn):print(conn.recv())if __name__ == '__main__':conn1, conn2 = Pipe()Process(target=send_data, args=(conn1, 'Hello')).start()Process(target=receive_data, args=(conn2,)).start()

2. 使用 Queue(队列)

from multiprocessing import Queue, Processdef set_data(q, val):q.put(val)def get_data(q):print(q.get())if __name__ == '__main__':q = Queue()Process(target=set_data, args=(q, '数据')).start()Process(target=get_data, args=(q,)).start()

五、进程同步(锁)

1. 不加锁的输出(可能混乱)

from multiprocessing import Process
import os, timedef task():print(f"{os.getpid()} start")time.sleep(2)print(f"{os.getpid()} end")for _ in range(3):Process(target=task).start()

2. 加锁保证输出顺序

from multiprocessing import Process, Lock
import os, timedef task(lock):with lock:print(f"{os.getpid()} start")time.sleep(2)print(f"{os.getpid()} end")if __name__ == '__main__':lock = Lock()for _ in range(3):Process(target=task, args=(lock,)).start()

六、共享状态

1. 使用共享内存:ValueArray

from multiprocessing import Process, Value, Arraydef modify(shared_num, shared_arr):shared_num.value = 100.5for i in range(len(shared_arr)):shared_arr[i] = -shared_arr[i]if __name__ == '__main__':num = Value('d', 0.0)arr = Array('i', range(5))p = Process(target=modify, args=(num, arr))p.start()p.join()print(num.value)print(arr[:])

2. 使用 Manager 提供的共享对象

from multiprocessing import Process, Managerdef modify(shared_dict, shared_list):shared_dict[1] = '一'shared_list.reverse()if __name__ == '__main__':with Manager() as manager:d = manager.dict()l = manager.list(range(5))p = Process(target=modify, args=(d, l))p.start()p.join()print(d)print(l)

七、实战总结

应用场景推荐方案原因说明
CPU 密集型任务多进程绕过 GIL,真正多核并行
I/O 密集型任务多线程 / 协程利用线程或异步释放等待时间
多任务并发管理进程池(Pool)简化进程创建与调度,避免资源浪费
多进程通信Pipe / Queue实现进程间数据传输
状态共享Value / Array / Manager灵活、安全地在进程间共享数据

八、推荐阅读

  • 📚 官方文档:multiprocessing — Process-based parallelism

相关文章:

  • PyTorch安装Cuda版本选择
  • xxl-job快速创建复制任务
  • H-ZERO导出组件支持智能分片、异步导出、动态配置等高级特性,让“一键导出”成为现实!
  • 【ARM】MDK浏览信息的生成对于构建时间的影响
  • MySql--explain的用法
  • 第2讲、从启动到表单加载:Odoo 18 的完整执行流程详解
  • Dolphin文档解析从理论到实践——保姆级教程
  • SSM 框架深度整合实战:从零构建企业级 Java 应用
  • Redission学习专栏(一):快速入门及核心API实践
  • 【操作系统】硬件结构知识点详解
  • Linux Crash工具全解:内核崩溃分析的一切
  • 自动化测试常见函数(上篇)
  • day22-定时任务故障案例
  • docker容器间服务访问的问题
  • mimics导出图像 标注文件
  • css样式块重复调用
  • 通义实验室开源针对RAG的预训练框架
  • Lua中table、模块、元表和元方法
  • delta 流响应
  • 【C/C++】delete nullptr;
  • 网站建设预算/郑州网站排名优化公司
  • 怎么攻击织梦网站/最近新闻摘抄50字
  • 如何做转运网站/品牌营销策略论文
  • 东南亚做网站 什么语言/国外域名注册
  • 网站诊断表/百度关键词排名查询
  • 哈尔滨seo/安卓aso关键词优化