直觉上,输出应始终为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}')
答案 0 :(得分:0)
增量运算符+=
不是原子的。这意味着以这种方式使用是不安全的。当您调用此运算符时,将读取该值,然后将其替换为。如果第二个进程更改了这两个操作之间的值,则该更改将丢失。
答案 1 :(得分:0)
您的问题是这个语句:
/node_modules/
它将读取您的字典,然后以c递增并存储该值,但这不是原子操作。另一个进程可能已更改了读和写操作之间的字典,然后您的写操作将“覆盖”操作之间发生的更改。
您可以通过传递锁并使用它来解决此问题:
dic['count'] += c
这可确保整个字典操作保持原子性。