You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何不同的multiprocessing.Value对象指向同一值?

问题原因分析

你遇到的现象核心原因是父进程中临时创建的multiprocessing.Value对象被垃圾回收,导致其共享内存段被复用,具体如下:

1. 第一种场景(无变量存储Value)的问题

当你直接在Process构造函数的kwargs中创建multiprocessing.Value时:

  • 父进程创建第一个Value对象,将其传递给第一个子进程后,由于父进程没有保留对这个Value的引用,该对象会立即被Python的垃圾回收机制销毁。
  • multiprocessing.Value底层依赖共享内存段,当对象被销毁时,对应的共享内存会被释放。
  • 父进程接着创建第二个Value对象时,系统可能会复用刚刚释放的同一块共享内存。
  • 最终,两个子进程的Value对象实际上指向了同一块共享内存,因此它们能互相修改对方的计数器值,不会发生死锁。

2. 第二种场景(用变量存储Value)的正常行为

当你先将Value对象存储到counterA和counterB变量中时:

  • 父进程保留了对这两个Value对象的引用,它们不会被垃圾回收,对应的共享内存段也不会被释放。
  • 两个子进程分别使用独立的共享内存段:第一个子进程的计数器变为1后进入等待,第二个子进程的计数器始终为0,无法触发递增逻辑,因此出现预期的死锁。

3. 自定义类无此问题的原因

CustomCounter是普通的Python对象,不依赖共享内存。当父进程将其传递给子进程时,子进程会得到该对象的副本,而非共享内存引用。因此两个子进程的计数器完全独立,会按预期进入死锁状态。

内容的提问来源于stack exchange,提问作者Christopher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 15:10:55