使用多处理时,全局变量未在python中更新

时间:2017-08-15 14:48:33

标签: python multiprocessing global-variables

我有以下简单代码

from multiprocessing import Pool
x = []


def func(a):
    print(x,a)


def main():
    a = [1,2,3,4,5]
    pool = Pool(1)
    global x
    x = [1,2,3,4]
    ans = pool.map(func,a)
    print(x)

它给了我结果

[] 1
[] 2
[] 3
[] 4
[] 5
[1, 2, 3, 4]

我预计结果会反映全局变量x的变化。 似乎在池调用之前未更新全局变量x中的更改。我想问一下这是什么原因?

3 个答案:

答案 0 :(得分:1)

所以我做了广生作所说的,遗憾的是结果不可取。在深入研究之后,我意识到问题不是因为脚本,而是因为操作系统。

在Windows中,没有os.fork(),因此不会复制全局变量的更改。但是,在Unix机器上,脚本运行正常。

答案 1 :(得分:0)

两个单独的进程不会共享相同的全局变量。多处理池抽象出你正在使用两个单独的进程这一事实,这使得这很难识别。

答案 2 :(得分:0)

我认为这是因为这是多进程,而不是多线程。主进程和新进程不共享相同的全局变量。因此,当x为[]时,新进程具有主进程的副本,并且在创建之后,主进程会更改x的值,但它不会更改为新进程的x。

如果将代码更改为:

from multiprocessing import Pool
x = []


def func(a):
    print(x,a)


def main():
    a = [1,2,3,4,5]
    global x
    x = [1,2,3,4]
    pool = Pool(1)
    ans = pool.map(func,a)
    print(x)

并且输出将是你想要的。 注意 pool = Pool(1)的位置