我有一个脚本,我的所有员工都会更新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是一种过度杀戮,但不确定是否有其他方法可以做到这一点。
当您尝试访问其管理的对象时,提供对Manager.list
的访问的Manager
服务器不会进行任何同步。基本上,你可以用与处理线程和一个普通全局变量完全相同的方式来思考它;由于GIL的原因,两个线程在执行原子字节码操作时无法实际相互踩在一起,但执行诸如递增变量之类的操作(需要多个字节码操作)需要受到锁的保护。
在您的情况下,只有当多个工人并行地对同一子列表执行某些操作时,您才会遇到麻烦。如果两个工人同时运行:
sub_l = x[i]
sub_l[i] = sub_l[i] + <something unique to the worker>
x[i] = sub_l
有了同样的我,他们最终可能会互相践踏;两者都将存储相同sub_l
的副本,并且两者都将递增sub_l[i]
,然后两者都将更新x[i]
,但是更新x
的第二个将覆盖第一个所做的更改。
只要你不试图在员工之间并行地做这些事情,你就应该没事。