为什么子进程总是拿不到数据?聊聊Python多进程里的“隔阂”
免费编程软件「pythonpycharm」链接https://pan.quark.cn/s/48a86be2fdc0一个让我在数据清洗项目上翻车的Bug去年我接了一个数据清洗的活需要处理100万行日志数据。每行数据要做格式校验、字段提取、类型转换纯Python跑起来慢得让人抓狂。我心想Python多线程有GIL那我用多进程总行了吧每个核跑一个进程4核机器至少提速3倍。于是我写了这样的代码import multiprocessing as mp # 全局配置所有子进程都要用 CONFIG {date_format: %Y-%m-%d, max_length: 100} def clean_line(line): # 用CONFIG里的配置清洗单行数据 # ... return cleaned if __name__ __main__: with mp.Pool(4) as pool: results pool.map(clean_line, data)看起来没问题吧跑起来之后诡异的事情发生了配置在子进程里经常读不到有时候读到的还是旧值。我当时完全懵了——全局变量不是所有地方都能访问吗为什么子进程就不行后来我才明白多进程之间是“隔阂”的每个进程有自己独立的记忆空间你主进程里的变量子进程根本看不见。为什么子进程拿不到你的数据要理解这个问题先记住一句话进程是独立的。当你用multiprocessing.Process或者Pool创建一个子进程时Python会做这样几件事启动一个新的Python解释器相当于重新打开了一个Python程序在新的解释器里重新执行你的代码包括导入模块、定义函数、执行全局代码子进程有自己的内存空间和主进程完全隔开所以你在主进程里定义的CONFIG、my_list、global_counter子进程都看不见。不是Python不让它们共享而是操作系统根本不允许一个进程随便读另一个进程的内存。阿里云开发者社区的一篇文章里有一个很直观的例子from multiprocessing import Process num 10 # 主进程的全局变量 def run(): global num num 1 print(f子进程里: {num}) if __name__ __main__: p Process(targetrun) p.start() p.join() print(f主进程里: {num})运行结果子进程里: 11 主进程里: 10看到了吗子进程改了num主进程里的num纹丝不动。子进程拿到的是num的一份拷贝而不是引用。子进程为什么总是“拿不到数据”真实项目里“拿不到数据”通常表现为这几种情况情况1全局变量在子进程里是“初始值”就像前面的例子你在主进程里修改了CONFIG然后启动子进程子进程看到的CONFIG可能是最初的值——因为子进程启动时重新执行了模块代码用的是初始值。情况2Windows下更坑在Windows系统上multiprocessing启动子进程时会重新导入主模块。这意味着模块顶层所有的代码都会在子进程里再执行一遍。如果模块顶层有耗时的初始化操作比如加载大模型、连接数据库每个子进程都会重复执行一遍你的程序会慢到怀疑人生。情况3进程池(map)里修改不了列表你可能会这样写results [] # 想把结果收集到这里 def worker(x): results.append(x * 2) # 试图修改全局列表 with mp.Pool(4) as pool: pool.map(worker, range(10)) print(results) # 还是空的每个子进程修改的是自己那份results的拷贝主进程的results从来没变过。那怎么让子进程“拿到”数据好消息是Python提供了好几种办法来打破这种“隔阂”。方法1通过参数传递最推荐不要依赖全局变量把要用的数据通过参数传进去def clean_line(line, config): # 用传进来的config不用全局的 return cleaned if __name__ __main__: CONFIG {...} with mp.Pool(4) as pool: # 把config作为参数传进去 results pool.map(lambda x: clean_line(x, CONFIG), data)这是最简单、最干净的方式。数据从一个地方流向另一个地方没有隐式的全局依赖。方法2用multiprocessing.Queue传递数据Queue是一个可以在多个进程之间安全传递数据的队列。from multiprocessing import Process, Queue def worker(q): q.put(子进程处理完了) if __name__ __main__: q Queue() p Process(targetworker, args(q,)) p.start() result q.get() # 主进程收到子进程的消息 print(result)Queue的原理是一个进程把数据放进去另一个进程取出来。数据被序列化后在进程间传递。方法3用Manager共享对象如果你想让多个子进程共享一个列表或字典可以用Managerfrom multiprocessing import Process, Manager def worker(shared_list): shared_list.append(来自子进程的数据) if __name__ __main__: manager Manager() shared_list manager.list([主进程的数据]) p Process(targetworker, args(shared_list,)) p.start() p.join() print(shared_list) # [主进程的数据, 来自子进程的数据]Manager的原理是启动一个独立的“管理器进程”所有对共享数据的操作都通过这个进程来协调。缺点是慢因为每次读写都要走进程间通信。方法4用shared_memory共享内存Python 3.8如果数据量大且对性能有要求可以用shared_memory模块from multiprocessing import shared_memory import numpy as np # 主进程创建共享内存 shm shared_memory.SharedMemory(createTrue, size100) # 子进程通过名字连接到这块内存 shm_b shared_memory.SharedMemory(nameshm.name)这是最高效的方式数据在内存中直接共享不需要序列化和复制。一张图理清楚你想要做的事错误做法正确做法子进程读主进程的配置用全局变量通过函数参数传递子进程返回结果给主进程修改全局列表用Queue或返回值多个子进程共享一个计数器用全局变量用Manager或Value多个子进程共享超大数组用Manager列表用shared_memory回到开头的Bug我那个数据清洗项目最后怎么解决的我把CONFIG从全局变量改成了函数参数每个子进程通过参数拿到配置。至于那些需要汇总的结果我用Queue从子进程收集回来。虽然代码多写了几行但再也不会有“子进程拿不到数据”的烦恼了。记住多进程之间是“隔阂”的别指望它们共享记忆。想要传递数据要么递纸条参数/Queue要么用公共黑板Manager/shared_memory。

相关新闻

【计算机Java毕业设计案例】高校学生学籍变动与档案更新管理系统的设计与实现 轻量化校园学生档案信息化管理系统(程序+文档+讲解+定制)

【计算机Java毕业设计案例】高校学生学籍变动与档案更新管理系统的设计与实现 轻量化校园学生档案信息化管理系统(程序+文档+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/3 20:52:21阅读更多 →
ICMP Timestamp漏洞:一个被忽视的信息泄露风险与修复指南

ICMP Timestamp漏洞:一个被忽视的信息泄露风险与修复指南

1. 项目概述:一个被忽视的“老”漏洞在网络安全领域,我们常常追逐最新的零日漏洞、复杂的供应链攻击,却容易忽略一些看似简单、存在已久的协议级问题。ICMP timestamp请求响应漏洞,就是这样一个典型的例子。它不像Log4j2那样能掀起…

2026/7/3 20:52:21阅读更多 →
MuleSoft企业级AI编排:构建可治理、可审计、可降级的LLM服务总线

MuleSoft企业级AI编排:构建可治理、可审计、可降级的LLM服务总线

1. 项目概述:当企业级集成平台遇上大语言模型,不是叠加,而是重定义“AI Orchestration in Action: How MuleSoft and LLMs Fuel the Future of Enterprise AI”——这个标题里藏着一个正在发生的、静默却剧烈的范式迁移。它说的不是“用MuleS…

2026/7/3 20:47:21阅读更多 →
2026中英文语音识别怎么选?清楚准好整理的方案更省事

2026中英文语音识别怎么选?清楚准好整理的方案更省事

"2026年选中英文语音识别工具,核心判断标准就是“清楚、准确、好整理”三个维度,不用追花里胡哨的附加功能,对学生群体来说,能满足课堂转写、论文访谈整理、小组讨论记录核心需求,不用后续花大量时间二次整理的工…

2026/7/3 23:27:44阅读更多 →
【JAVA毕设源码分享】基于springboot自行车分享平台的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于springboot自行车分享平台的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/3 23:27:44阅读更多 →
让桌面活起来:用DyberPet打造你的专属数字伙伴

让桌面活起来:用DyberPet打造你的专属数字伙伴

让桌面活起来:用DyberPet打造你的专属数字伙伴 【免费下载链接】DyberPet Desktop Cyber Pet Framework based on PySide6 项目地址: https://gitcode.com/GitHub_Trending/dy/DyberPet 桌面宠物框架正重新定义我们与数字世界的互动方式,而DyberP…

2026/7/3 23:27:44阅读更多 →
LARA-R6401 LTE模块与MKV44F64VLH16 MCU的硬件连接与优化实践

LARA-R6401 LTE模块与MKV44F64VLH16 MCU的硬件连接与优化实践

1. LARA-R6401模块深度解析LARA-R6401是u-blox公司推出的一款高性能LTE Cat 1模块,专为北美市场设计。这款模块支持LTE FDD频段2/4/5/12/13/14/66/71,完美兼容AT&T、Verizon、T-Mobile和FirstNet等主流运营商网络。作为开发者,我最看重的…

2026/7/3 23:27:44阅读更多 →
AI学习路径:从数学基础到工程实践的完整指南

AI学习路径:从数学基础到工程实践的完整指南

1. 从零开始构建AI学习体系作为一名长期奋战在AI研发一线的工程师,我经常被问到"如何系统学习人工智能"。今天我想分享自己十二年来积累的学习笔记和方法论,希望能帮助更多人少走弯路。AI学习就像建造一座大厦,需要从地基开始层层递…

2026/7/3 23:27:44阅读更多 →
如何永久保存微信聊天记录?5步完成微信聊天数据完整备份与智能分析终极指南

如何永久保存微信聊天记录?5步完成微信聊天数据完整备份与智能分析终极指南

如何永久保存微信聊天记录?5步完成微信聊天数据完整备份与智能分析终极指南 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitH…

2026/7/3 23:22:44阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/7/3 14:18:39阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

2026/7/3 14:38:35阅读更多 →
LV3296与PIC18F45K22的UART通信与USB扩展方案

LV3296与PIC18F45K22的UART通信与USB扩展方案

1. LV3296与PIC18F45K22的硬件搭档解析在嵌入式数据采集系统中,LV3296条形码扫描模块与PIC18F45K22微控制器的组合堪称经典搭配。LV3296作为一款工业级条码扫描头,其核心是一颗高性能CMOS图像传感器,配合专用解码芯片,能自动识别包…

2026/7/3 0:03:41阅读更多 →
AI初创生存指南:6个月完成可信度验证闭环

AI初创生存指南:6个月完成可信度验证闭环

1. 这不是“逆袭指南”,而是一份AI初创公司真实生存手记“How To Beat Odds As an AI Startup?”——这个标题乍看像一句热血口号,但在我带过7个从0到1的AI产品团队、亲手踩过融资失败、技术债崩盘、客户POC卡在最后一公里等23类典型坑之后,…

2026/7/3 0:03:41阅读更多 →
多模态+推理链+RAG 2.0+智能体:工业级AI系统落地四支柱

多模态+推理链+RAG 2.0+智能体:工业级AI系统落地四支柱

1. 这不是又一篇“AI趋势速览”,而是一份实操者手记:当多模态、推理链、检索增强与智能体协作真正撞进工程现场“LAI #73”这个编号本身就像一个暗号——它不属于某家大厂的白皮书,也不是学术会议的议程表,而是长期泡在模型训练集…

2026/7/3 0:03:41阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/3 1:12:46阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/3 1:36:36阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/3 2:08:15阅读更多 →