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

时间:2015-04-15 04:41:43

标签: python global-variables multiprocessing

我有一个脚本,我的所有工作人员都在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是一种过度杀戮,但不确定是否有其他方法可以做到这一点。

1 个答案:

答案 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会覆盖更改由第一个完成。

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