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

Python multiprocessing模块介绍

multiprocessing 是 Python 标准库中的一个模块,用于实现多进程并行计算,可以在多核 CPU 上显著提升程序性能,尤其适用于 CPU 密集型任务。Python 的多线程由于 GIL(全局解释器锁)限制,在进行 CPU 密集型任务时无法真正实现并行。而 multiprocessing 模块通过创建多个子进程,每个子进程拥有独立的 Python 解释器,因此可以实现真正的并行运行。

常用组件一览

组件用途
Process创建单个进程
Pool创建进程池,适合大量任务并行处理
Queue进程间通信(FIFO)
Pipe进程间双向通信
Manager管理共享数据结构
Lock / RLock进程同步,避免资源竞争

常见用法

1. 使用 Process 创建子进程
from multiprocessing import Processdef worker(name):print(f"Hello from {name}")if __name__ == "__main__":p = Process(target=worker, args=("Process-1",))p.start()p.join()

调用 start() 方法启动子进程,调用 join() 方法等待子进程结束。

2. 使用 Pool 创建进程池(适合大规模任务)

from multiprocessing import Pooldef square(x):return x * xif __name__ == "__main__":with Pool(processes=4) as pool:results = pool.map(square, [1, 2, 3, 4, 5])print(results)  # [1, 4, 9, 16, 25]

Pool.map() 类似于内置的 map(),但是会并行运行。

3. imap / imap_unordered(流式并行)
for result in pool.imap_unordered(square, range(10)):print(result)
  • imap() 保持顺序

  • imap_unordered() 不保持顺序(更快)

4. 使用 Queue 进行进程通信
from multiprocessing import Process, Queuedef producer(q):q.put("Data from producer")def consumer(q):print(q.get())if __name__ == "__main__":q = Queue()p1 = Process(target=producer, args=(q,))p2 = Process(target=consumer, args=(q,))p1.start()p2.start()p1.join()p2.join()
5. 使用 Manager 实现共享变量
from multiprocessing import Manager, Processdef worker(shared_list):shared_list.append("hello")if __name__ == "__main__":with Manager() as manager:lst = manager.list()p = Process(target=worker, args=(lst,))p.start()p.join()print(lst)  # ['hello']

注意事项

  • 多进程必须加 if __name__ == "__main__":,防止无限递归。

  • 进程间不共享内存空间,需要通过 QueuePipe 或 Manager 传递数据。

  • 不适合 I/O 密集型任务,I/O 密集可考虑 asyncio 或 threading

适用场景

  • 大规模数据处理:如批量解析结构文件、图像处理、日志分析。

  • 训练模型并行跑实验:多组参数同时启动训练进程。

  • Web 抓取中的页面解析等 CPU 操作

相关文章:

  • ns-3中UDP饱和流发包时间间隔设置最合理值
  • Redis + Caffeine打造超速两级缓存架构
  • 未支付订单如何释放库存
  • 无参数RCE
  • hackmyvm-quick2
  • 如何从 GitHub 镜像仓库到极狐GitLab?
  • 2025年4月份生活有感
  • 【scikit-learn基础】--『监督学习』之 K-近邻分类
  • 第T8周:猫狗识别
  • 红帽Linux网页访问问题
  • 【工具变量】1907年大清邮政舆图数据集(高清图+PDF)
  • confluent-kafka入门教程
  • Windows 下 MongoDB ZIP 版本安装指南
  • 【Linux系统篇】:从匿名管道到命名管道--如何理解进程通信中的管道?
  • 《如何结合XMind和DeepSeek高效生成思维导图》
  • Obsidian 文件夹体系构建 -INKA
  • 华为OD机试真题—— 最少数量线段覆盖/多线段数据压缩(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
  • 网工_传输层协议概述
  • 无感改造,完美监控:Docker 多阶段构建 Go 应用无侵入观测
  • 【ES6新特性】Proxy进阶实战
  • 日均新开三家“首店”,上海的“首发经济”密码是什么?
  • 白酒瓶“神似”北京第一高楼被判侵权,法院一审判赔45万并停售
  • 内蒙古纪检干部刘占波履新呼和浩特,曾参与涉煤腐败倒查20年工作
  • 刘非任中共浙江省委常委、杭州市委书记
  • 马上评丨马拉松“方便门”被处罚,是一针清醒剂
  • 习近平举行仪式欢迎肯尼亚总统鲁托访华