我有一个脚本,我的所有工作人员都在Manager列表中更新了不同的字典。我的问题是:当一个工作人员正在编写列表时,其他人是否会等待它,或者所有工作人员可以同时更新列表?
这是我的代码:
from multiprocessing import Process, Manager
def worker(x, i, *args):
sub_l = x[i]
sub_l[i] = i
x[i] = sub_l
if __name__ == '__main__':
manager = Manager()
num = 4
x = manager.list([{}]*num)
p = []
for i in range(num):
p.append(Process(target=worker, args=(x, i)))
p[i].start()
for i in range(5):
p[i].join()
print x
我只需要所有工作人员单独运行,并更新不同的全局变量。我认为使用manager.list是一种过度杀戮,但不确定是否有其他方法可以做到这一点。
答案 0 :(得分:2)
当您尝试访问其管理的对象时,提供Manager
访问权限的Manager.list
服务器不会执行任何同步。你基本上可以想到它与你处理线程和普通全局变量的方式完全相同;由于GIL,在执行原子字节码操作时,两个线程不能实际上彼此重叠,但是执行诸如递增变量(需要多个字节码操作)之类的操作需要受到保护一把锁。
在您的情况下,如果多个工作人员在同一个子列表上并行执行某些操作,则您只会遇到麻烦。如果两个工人同时运行这个:
sub_l = x[i]
sub_l[i] = sub_l[i] + <something unique to the worker>
x[i] = sub_l
同样的i,他们最终可能会互相踩踏;两者都会存储相同sub_l
的副本,两者都会增加sub_l[i]
,然后两者都会更新x[i]
,但第二个更新x
会覆盖更改由第一个完成。
只要你不尝试在工人之间并行做这些事情,你应该没事。