检查多处理。获取锁后的值的值



下面是一个代码片段:

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 == 0with v.get_lock()之间绝对存在竞争条件。

所以你需要再次测试。

更重要的可能是-正如它在文档中所说,您(或稍后读到这篇文章的人)可能不希望共享内存,除非这是一个经过仔细考虑的决定。现在您的进程相互等待,这可能会扼杀多处理的主要好处。

相关内容

  • 没有找到相关文章

最新更新