0

0

Python multiprocessing 的常见性能陷阱

冰川箭仙

冰川箭仙

发布时间:2026-02-14 19:09:26

|

979人浏览过

|

来源于php中文网

原创

process 启动比 thread 慢因需 fork/spawn 复制内存、重载模块;子进程重复初始化易致卡顿或 oom,应将耗时操作移至主进程或用 initializer 控制;windows/macos 默认 spawn 需重导入,linux fork 可能死锁;queue 线程安全但有锁开销,pipe 更快但仅双端;全局变量不共享,应用 value/array;processpoolexecutor 默认 cpu 核数对 i/o 任务过载,需调优 max_workers 并异步取结果;性能瓶颈常在 pickle 和 ipc,非单纯核数问题。

python multiprocessing 的常见性能陷阱

为什么 Process 启动比 Thread 慢得多

因为每次创建 Process 都要 fork(Unix/Linux/macOS)或 spawn(Windows),复制整个解释器内存空间,加载模块、重建对象图——这不是“开个线程”那种轻量操作。

常见错误现象:Process(target=heavy_init_func).start()heavy_init_func 在子进程里重复执行初始化(如加载大模型、读大文件),导致启动卡顿甚至 OOM。

  • 把耗时初始化移到 if __name__ == '__main__': 块外,但确保只在主进程运行;子进程用 if hasattr(sys, '_called_from_multiprocessing'): 或更稳妥地:用 initializer + initargs 显式控制
  • Windows/macOS 默认用 'spawn' 启动方式,必须重新 import 所有依赖模块;Linux 默认 'fork' 虽快,但若主进程已调用 threading.Locklogging 等非 fork-safe 对象,子进程可能死锁
  • mp.set_start_method('spawn', force=True) 统一行为,尤其在打包成可执行文件(PyInstaller)时,'fork' 会失效

QueuePipe 选哪个?吞吐差 3–5 倍

Queue 是线程安全的封装,底层用 Pipe + threading.Lock + 后台线程做收发;Pipe 是裸的双端通道,无锁,但只能连两个进程。

使用场景:高频小数据(如每秒万级日志条目)传参,Pipe 更稳;多对一聚合(如 8 个 worker 往一个 collector 发结果),必须用 Queue

立即学习Python免费学习笔记(深入)”;

LogoMaker
LogoMaker

免费在线制作Logo,在几分钟内完成标志设计

下载
  • Queueput() 默认阻塞,若消费者崩溃或没及时 get(),队列填满后生产者永久卡住——加 timeout 并捕获 queue.Full
  • Piperecv() 在另一端关闭后会抛 EOFError,不是 None;别用 while conn.poll(): conn.recv() 轮询,CPU 占满;改用 conn.poll(timeout)
  • 传输大于 1MB 的对象时,QueuePipe 都会触发 pickle 序列化开销;考虑用 mmapshared_memory(Python 3.8+)传原始字节

全局变量在子进程里“不更新”的真相

每个 Process 有独立内存空间,主进程里的全局变量只是被 copy 了一份,改了等于没改。这不是 bug,是设计如此。

常见错误现象:定义 CONFIG = {'debug': True},主进程改 CONFIG['debug'] = False,子进程里打印还是 True

  • 想共享简单值(int/bool/float),用 mp.Valuemp.Array;注意类型声明必须精确,比如 mp.Value('i', 0) 不能存浮点数
  • 想共享字典或列表,别用 mp.Manager().dict() —— 它走网络协议模拟,慢且单点瓶颈;真需要复杂结构,用 concurrent.futures.ProcessPoolExecutor + 显式传参,避免共享
  • @mp.context._ForkContext(非公开 API)强行绕过 fork/spawn 差异?别试。跨平台行为不可控,PyPI 包里已有人踩坑崩溃

为什么 ProcessPoolExecutor 有时比手写 Process 还慢

因为默认最大工作进程数 = os.cpu_count(),但如果你的任务是 I/O 密集型(比如发 HTTP 请求),开满 CPU 核反而导致频繁上下文切换和连接池争抢。

性能影响:CPU 密集任务(如计算 π、图像处理)适合 max_workers=os.cpu_count();I/O 密集任务(如爬虫、数据库查询)设为 48 更稳。

  • submit() 返回 Future,但很多人直接 future.result() 同步等,等于退化成串行——该用 as_completed()map() 批量提交+异步取结果
  • 子进程异常不会自动打印,future.exception()None 直到你调用 result() 才抛出;加日志钩子:在 initializer 里配置 logging.basicConfig(),否则 stderr 丢失
  • 进程池关闭后,未完成的 Future 不会自动取消;显式调用 executor.shutdown(wait=False) + future.cancel(),但注意:已进入子进程执行的任务无法中断

最常被忽略的一点:multiprocessing 的性能拐点不在代码逻辑,而在数据序列化成本和进程间通信模式。别急着加核数,先用 cProfilepsutil 看清瓶颈到底在 pickle、I/O 还是纯计算。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

587

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

104

2025.10.23

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

810

2023.08.22

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

102

2023.09.25

全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

85

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

101

2025.09.18

全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

85

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

101

2025.09.18

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

23

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 4.3万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号