以下是代码段:
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()
变化,获取锁定后是否需要再次检查?
我可以想象以下流程在获得锁定后没有额外检查:
该值将是P2设置的值,即使P1获得锁定并首先更改它。
我对自己的假设是错误的吗?在获得锁之后添加额外的检查是否在每种情况下都能解决问题?如果是这样,它被认为是一种好习惯吗?
答案 0 :(得分:1)
我还没有将共享内存对象用于多处理,但if v.value == 0
和with v.get_lock()
之间绝对有race condition。
所以是的,你需要再次测试。
更重要的是,可能 - as it says in the docs,你(或者后来读到的人)可能不想分享记忆,除非这是经过仔细考虑的决定。现在你有进程等待,这可能会破坏多处理的主要好处。