我有以下简单代码
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
中的更改。我想问一下这是什么原因?
答案 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)的位置