获得锁后检查 multiprocessing.Value 的值
Checking a multiprocessing.Value's value after getting the lock
这是一个代码片段:
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()
之间绝对有一个 race condition。
所以是的,您需要再次测试。
也许更重要的是 - as it says in the docs,您(或稍后阅读本文的人)可能不想共享内存,除非这是经过深思熟虑的决定。现在你有进程相互等待,这可能会破坏多处理的主要好处。
这是一个代码片段:
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()
之间绝对有一个 race condition。
所以是的,您需要再次测试。
也许更重要的是 - as it says in the docs,您(或稍后阅读本文的人)可能不想共享内存,除非这是经过深思熟虑的决定。现在你有进程相互等待,这可能会破坏多处理的主要好处。