为什么以下多次处理代码片段多次运行时输出不同?

时间:2020-05-28 15:32:45

标签: python multiprocessing pool

直觉上,输出应始终为15。但是有时,它会生成11或12或其他值。我尝试添加一些延迟,但没有解决问题。

from multiprocessing import Pool, Manager
import time

def func(dic, c):
    dic['count'] += c
    # time.sleep(0.1)

if __name__=="__main__":
    d = Manager().dict()    # a manager to enable data sharing b
    d['count'] = 0
    args = [(d,1), (d,2), (d,3), (d,4), (d,5)]
    pool = Pool(5)
    pool.starmap(func, args)   
    pool.close()
    pool.join()
    print(f'dic={d}')

2 个答案:

答案 0 :(得分:0)

增量运算符+=不是原子的。这意味着以这种方式使用是不安全的。当您调用此运算符时,将读取该值,然后将其替换为。如果第二个进程更改了这两个操作之间的值,则该更改将丢失。

查看此答案: Is the += operator thread-safe in Python?

答案 1 :(得分:0)

您的问题是这个语句:

/node_modules/

它将读取您的字典,然后以c递增并存储该值,但这不是原子操作。另一个进程可能已更改了读和写操作之间的字典,然后您的写操作将“覆盖”操作之间发生的更改。

您可以通过传递锁并使用它来解决此问题:

dic['count'] += c

这可确保整个字典操作保持原子性。