0

0

Python 多进程并发模型解析

舞夢輝影

舞夢輝影

发布时间:2026-01-31 14:02:05

|

600人浏览过

|

来源于php中文网

原创

multiprocessing子进程不继承主线程全局变量修改,因其通过fork或spawn新建独立内存空间;Pool的maxtasksperchild用于定期重启worker防内存泄漏;Queue传大对象慢因序列化开销大,应优先用shared_memory;Windows下不加if name == "__main__":会导致子进程重复执行顶层代码而崩溃。

python 多进程并发模型解析

为什么 multiprocessing 启动的子进程不继承主线程的全局变量修改?

因为子进程是通过 fork(Unix/Linux/macOS)或 spawn(Windows/部分 macOS 配置)方式全新创建的,内存空间独立。主线程对全局变量(如 config = {"debug": True})的运行时修改,不会自动同步到子进程中。

常见错误现象:在主进程中改了 LOG_LEVEL,子进程里打印仍是默认值;或用 global 修饰的变量在子进程里为空。

  • Unix 系统下若用 fork 启动方式,子进程会复制父进程的内存快照,但后续修改互不影响
  • Windows 必须用 spawn,每次启动子进程都会重新导入模块、执行顶层代码,所以连初始值都要靠模块重载保证一致
  • 跨平台安全做法:把配置显式传给子进程,例如通过 Process(target=worker, args=(config,)) 或使用 multiprocessing.Manager().dict()

multiprocessing.Poolmaxtasksperchild 有什么实际作用?

它控制每个子进程最多处理多少个任务后自动退出并被新进程替换。不是“限制并发数”,而是用于缓解内存泄漏或状态累积问题。

使用场景:长期运行的 worker 处理大量任务,且内部使用了无法自动释放的资源(如未关闭的文件句柄、缓存不断增长的字典、第三方 C 库的静态状态)。

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

  • 设为 None(默认):子进程永生,风险是内存缓慢上涨
  • 设为 100:每处理完 100 个任务就重启该 worker,开销小但能重置内存和状态
  • 注意:重启有轻微调度成本,别设成 1;也别依赖子进程间共享可变状态,因为它随时可能被换掉

为什么用 multiprocessing.Queue 传大对象比 pipe 更慢还容易卡住?

因为 Queue 底层基于 Pipe + 单独的监控线程 + 序列化(pickle),而大对象序列化耗时高,且 Queue 有内置缓冲区大小限制(默认无限,但受系统 pipe buffer 和内存影响)。

kgshop金刚网店系统
kgshop金刚网店系统

KgShop,是国内一款快速/稳定/安全的开源电子商城系统,采用linux,mysql,srutsEX,hibernate,ejb3等技术,Kghop第一版诞生于2010年,经过多年开发,Kgshop系统已拥有快速、稳定、支持大量并发访问等软件特性,是10万人在线的JAVA商城优秀解决方案。KgShop拥有良好的模板机制,易于进行二次开发。Kgshop每一行代码都经过严谨的测试,汇聚大批工程师多年

下载

典型错误现象:传一个 500MB 的 numpy.ndarray,主进程卡在 q.put(arr),子进程迟迟收不到;或出现 OSError: [Errno 32] Broken pipe

  • 优先考虑 multiprocessing.shared_memory(Python 3.8+)共享内存块,避免拷贝和序列化
  • 若必须用 Queue,提前调用 arr = np.ascontiguousarray(arr) 加速 pickle,或改用 joblib.dump/load 分块序列化
  • Pipe 更轻量,适合点对点、少量高频通信,但它不支持多生产者/消费者,也不能用在 Pool 场景中

Windows 下 if __name__ == "__main__" 不加会导致什么?

子进程启动时会重新执行整个脚本顶层代码,包括再次创建 Pool、再次导入模块、甚至重复初始化数据库连接——最终引发 RuntimeError: An attempt has been made to start a new process before the current process has finished its bootstrapping phase

这不是风格建议,而是 Windows 的 spawn 启动机制强制要求。

  • 所有使用 multiprocessing 的脚本,在 Windows 或跨平台分发时,必须把 Pool/Process 创建逻辑包进 if __name__ == "__main__":
  • PyInstaller 打包后也遵循同样规则,漏写会导致生成的 exe 在双击运行时报错退出
  • macOS/Linux 虽可用 fork 暂时绕过,但一旦切换启动方法(如设置 mp.set_start_method("spawn")),同样崩溃

多进程真正难的不是启动几个子进程,而是数据怎么传、状态怎么管、异常怎么捕获、资源怎么回收。尤其当逻辑从单进程迁移到多进程时,看似只改两行代码,实则每处变量访问都得重新评估作用域和生命周期。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
if什么意思
if什么意思

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

783

2023.08.22

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

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

82

2025.09.18

python 全局变量
python 全局变量

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

96

2025.09.18

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

525

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

525

2023.08.10

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

831

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1130

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

804

2023.08.01

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

54

2026.01.31

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 8.2万人学习

Git 教程
Git 教程

共21课时 | 3.2万人学习

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

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