为何不同的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
相关产品推荐
相关产品推荐

