讲师中心 微信公众号

工具推荐

视频效率加速
Seko
Seko

AI短剧一键生成成片

updream

一键生成高质量推广成片

剧云
剧云

中文短剧剧本制作平台

立刻MV
立刻MV

低成本歌曲 MV、视频生成

Python multiprocessing 的常见性能陷阱

落伟大大_5154

落伟大大_5154

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

|

1019人浏览过

|

来源于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.Lock 或 logging 等非 fork-safe 对象,子进程可能死锁
  • 用 mp.set_start_method('spawn', force=True) 统一行为,尤其在打包成可执行文件(PyInstaller)时,'fork' 会失效

Queue 和 Pipe 选哪个?吞吐差 3–5 倍

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

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

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

Python Pep Authoring
Python Pep Authoring

依据官方 python/peps仓库规则起草、审阅、编辑或准备 Python 改进提案(PEP),用于处理 PEP 文本和元数据头部。

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

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

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

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

  • 想共享简单值(int/bool/float),用 mp.Value 或 mp.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 密集任务(如爬虫、数据库查询)设为 4~8 更稳。

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

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

相关文章

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

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

下载

相关标签:

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

热门AI工具

更多
SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

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

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

7507

2024.04.28

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

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

884

2025.10.23

while的用法
while的用法

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

354

2023.09.25

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

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

5205

2025.09.18

python 全局变量
python 全局变量

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

2210

2025.09.18

c++ 全局变量
c++ 全局变量

本专题整合了c++全局变量的使用、定义、作用域等等内容,阅读专题下面的文章了解更多详细内容。

199

2026.03.17

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

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

5205

2025.09.18

python 全局变量
python 全局变量

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

2210

2025.09.18

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

60

2026.11.06

热门下载

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

精品课程

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn