【问题标题】:How come multiprocessing.Value isn't safe?为什么 multiprocessing.Value 不安全?
【发布时间】:2021-11-11 04:43:06
【问题描述】:
# src/test.py
import multiprocessing as mp
n = mp.Value('i', 0, lock=True)

def foo(n):
    for i in range(10000):
        n.value += 1

processes = []
for i in range(2):
    p = mp.Process(target=foo, args=[n])
    processes.append(p)

for p in processes:
    p.start()

for p in processes:
    p.join()

print(n.value)
$ python3 src/test.py 
17342
$ python3 src/test.py 
18485
$ python3 src/test.py 
12455

我认为multiprocessing.Value(超过multiprocessing.RawValue)的目的是它有一个锁,使其线程安全。为什么它给了我不同的结果?

【问题讨论】:

  • 它给出了不同的结果,因为你给了它不同的值。除非我误解了这个问题。您遗漏了预期的结果,因此我产生了误解。

标签: python python-3.x python-multiprocessing


【解决方案1】:

来自docs

+= 这样涉及读取和写入的操作不是原子的。因此,例如,如果您想以原子方式递增共享值,那么仅仅这样做是不够的

counter.value += 1

假设关联的锁是递归的(默认情况下是递归的),您可以改为这样做

with counter.get_lock():
    counter.value += 1

【讨论】:

    猜你喜欢
    • 2019-10-27
    • 2014-12-04
    • 2010-10-26
    • 2019-04-03
    • 1970-01-01
    • 2017-04-22
    • 2013-03-10
    • 2016-01-02
    • 1970-01-01
    相关资源
    最近更新 更多