下面是一个代码片段:
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先获得了锁并修改了它。
我的假设错了吗?在获得锁后添加额外的检查是否在每种情况下都能解决问题?如果是,它被认为是一种良好的实践吗?
我没有在多进程中使用共享内存对象,但是if v.value == 0
和with v.get_lock()
之间绝对存在竞争条件。
所以你需要再次测试。
更重要的可能是-正如它在文档中所说,您(或稍后读到这篇文章的人)可能不希望共享内存,除非这是一个经过仔细考虑的决定。现在您的进程相互等待,这可能会扼杀多处理的主要好处。