讲师中心 微信公众号

工具推荐

视频效率加速
立刻MV
立刻MV

低成本歌曲 MV、视频生成

Seko
Seko

AI短剧一键生成成片

剧云
剧云

中文短剧剧本制作平台

Laper
Laper

剧本策划到成片协作

Python 进程间资源竞争与防护

秋雪吖_8591

秋雪吖_8591

发布时间:2026-02-25 19:37:11

|

342人浏览过

|

来源于php中文网

原创

进程间共享变量总是错的,因为multiprocessing启动的是内存隔离的独立进程,全局变量或普通对象在各进程中只是独立副本;必须用Value、Array或Manager等显式同步工具。

python 进程间资源竞争与防护

进程间共享变量为什么总是错的

Python 的 multiprocessing 模块里,直接在多个进程里读写同一个全局变量或普通对象(比如 list、dict),结果几乎必然出错——不是数据丢失,就是值突变,甚至程序卡死。这不是你代码写得不熟,而是底层根本没同步机制。

原因很简单:multiprocessing 启动的是独立进程,内存完全隔离;你看到的“同一个变量”,其实是每个进程里各自拷贝的一份副本。改了 A 进程里的 counter,B 进程里的 counter 一无所知。

  • 别用 global 变量跨进程传状态
  • 别把可变对象(如 list)直接传给 Process 的 args 参数指望它能被修改后回传
  • 如果真要共享,必须显式选对工具:用 multiprocessing.Value 或 multiprocessing.Array 存基础类型,用 multiprocessing.Manager() 包装高级结构

Manager() 和 Value() 到底该选哪个

Manager() 灵活但慢,Value() 快但只能存单个数字或字符。选错会拖慢性能,甚至引入隐性竞争。

比如你要统计 10 个子进程一共处理了多少条日志:
– 用 Manager().Value('i', 0) 是对的,轻量且原子;
– 但如果改成 Manager().dict() 存一个计数器再加锁更新,就多了一层网络序列化开销,纯属自找麻烦。

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

Python Hardener
Python Hardener

通过完整的安全审查、代码整洁重构、健壮的错误处理、正确的日志记录以及完整的文档字符串覆盖,强化 Python 脚本。

下载
  • Value / Array:只支持 C 类型('i'、'd'、'c'),读写是原子的,无需额外加锁
  • Manager().list() / .dict():支持任意 Python 对象,但所有操作都走代理进程通信,延迟高,且 append、__setitem__ 这些不是原子的,仍需手动加 Lock
  • 别混用:比如用 Manager().dict() 存了个 list,再在子进程里对这个 list 调用 sort() —— 会报 AttributeError,因为 Manager 返回的是代理对象,不支持原生方法

Lock 不加在关键路径上等于没加

很多人加了 Lock,但还是出现竞态,问题常出在加锁范围太小或太随意。比如只锁了写入,却忘了读取也需要一致视图;或者把锁对象本身传错了进程,导致各锁各的。

典型错误:lock = Lock() 写在主进程里,然后通过 args=(shared_dict, lock) 传进子进程 —— 这不行。Lock 不能跨进程传递,必须在每个需要它的子进程中重新创建,或由 Manager() 提供(manager.Lock())。

  • 所有对共享资源的**读+写组合操作**都要包在 with lock: 里,比如“先查再改”这种逻辑
  • 不要在锁里做耗时操作(如 HTTP 请求、文件读写),否则整个进程池会被堵住
  • 用 manager.Lock() 而不是 multiprocessing.Lock(),后者无法跨进程生效

Windows 下 spawn 启动方式带来的坑

Windows 默认用 spawn 方式启动子进程(macOS/Linux 默认是 fork),这意味着子进程不会继承父进程的内存状态,所有模块重载、全局变量初始化、甚至 logging 配置都得重新走一遍。很多“本地跑得好,上线就崩”的问题根源在这。

比如你在主脚本顶部写了 logging.basicConfig(level=logging.INFO),子进程里调用 logging.info() 却没输出 —— 因为 spawn 下子进程没执行那行配置。

  • 所有子进程依赖的代码(函数定义、配置初始化、第三方库 setup)必须能被单独 import 执行,不能依赖主模块的执行上下文
  • 避免在 if __name__ == '__main__' 外写带副作用的语句;把共享逻辑抽成独立函数,确保可被多次导入
  • 调试时加一句 print(f'PID: {os.getpid()}, __name__: {__name__}'),能快速判断是不是 spawn 导致的模块重复加载

最麻烦的不是锁怎么写,而是你以为锁住了,其实连共享资源都没真正连上——尤其是跨平台部署时,spawn 和 Manager 的初始化时机稍有偏差,数据就静默丢失了。

热门AI工具

更多
函子Zion

一款支持AI搭建、可视化编辑和多端发布的全栈无代码开发平台。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

WorkBuddy

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

创客贴AI

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

DeepSeek

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

UP简历
UP简历 Hot

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

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

豆包大模型

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

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

3440

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

269

2026.02.03

sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

1158

2023.09.04

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

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

5285

2025.09.18

python 全局变量
python 全局变量

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

2230

2025.09.18

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

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

199

2026.03.17

append用法
append用法

append是一个常用的命令行工具,用于将一个文件的内容追加到另一个文件的末尾。想了解更多append用法相关内容,可以阅读本专题下面的文章。

618

2023.10.25

python中append的用法
python中append的用法

在Python中,append()是列表对象的一个方法,用于向列表末尾添加一个元素。想了解更多append的更多内容,可以阅读本专题下面的文章。

1496

2023.11.14

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

0

2026.11.12

热门下载

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

精品课程

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

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