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



我有以下简单的代码

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中的更改。我想问一下这是什么原因?

所以我按照广生左的建议做了,可悲的是结果并不理想。在深入研究之后,我意识到问题不是因为脚本,而是因为操作系统。

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

我认为这是因为这是多进程,而不是多线程。 主进程和新进程不共享相同的全局变量。所以当 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(的位置

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

相关内容

  • 没有找到相关文章