获取锁定后检查multiprocessing.Value的值

时间:2015-09-29 14:46:19

标签: python python-multiprocessing

以下是代码段:

from multiprocessing import Value
import os

v = Value('i', 0)

# The following code runs in multiple processes
if v.value == 0:
    with v.get_lock():
        if v.value == 0: # Is this line necessary?
            v.value = os.getpid()

由于os.getpid()变化,获取锁定后是否需要再次检查?

我可以想象以下流程在获得锁定后没有额外检查:

  • P1要求锁定
  • P2要求锁定
  • P1获取锁定并更改值
  • P1释放锁
  • P2获取锁定并更改值
  • P2释放锁

该值将是P2设置的值,即使P1获得锁定并首先更改它。

我对自己的假设是错误的吗?在获得锁之后添加额外的检查是否在每种情况下都能解决问题?如果是这样,它被认为是一种好习惯吗?

1 个答案:

答案 0 :(得分:1)

我还没有将共享内存对象用于多处理,但if v.value == 0with v.get_lock()之间绝对有race condition

所以是的,你需要再次测试。

更重要的是,可能 - as it says in the docs,你(或者后来读到的人)可能不想分享记忆,除非这是经过仔细考虑的决定。现在你有进程等待,这可能会破坏多处理的主要好处。