在Python中使用多处理更新不同的全局变量

在Python中使用多处理更新不同的全局变量,python,global-variables,multiprocessing,Python,Global Variables,Multiprocessing,我有一个脚本,让我的所有员工更新经理列表中的不同词典。我的问题是:当一个工作人员正在编写列表时,其他工作人员是否会等待它,或者所有工作人员都可以同时更新列表 这是我的密码: 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

我有一个脚本,让我的所有员工更新经理列表中的不同词典。我的问题是:当一个工作人员正在编写列表时,其他工作人员是否会等待它,或者所有工作人员都可以同时更新列表

这是我的密码:

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有点过分,但不确定是否有其他方法可以做到这一点。

提供对
管理器的访问的
管理器服务器。当您尝试访问其管理的对象时,list
不会进行任何同步。基本上,你可以像处理线程和一个普通的全局变量一样思考它;由于GIL,在执行原子字节码操作时,两个线程实际上无法相互叠加,但执行诸如递增变量之类的操作(需要执行多个字节码操作)需要锁的保护

在您的情况下,只有当多个工作人员同时对同一子列表执行某些操作时,您才会遇到麻烦。如果两名工人同时运行此操作:

sub_l = x[i]
sub_l[i] = sub_l[i] + <something unique to the worker>
x[i] = sub_l
sub_l=x[i]
sub_l[i]=sub_l[i]+
x[i]=sub_l
有了同样的我,他们最终可能会互相践踏;两者都将存储相同的
sub\u l
,并且都将递增
sub\u l[i]
,然后都将更新
x[i]
,但是更新
x
的第二个将覆盖第一个所做的更改

只要你不尝试在员工之间并行地做这些事情,你就应该没事