2014-04-04 31 views
2

说的更新,我这样做:多重的map函数忽略我的全局变量

import multiprocessing as mp 

y = 10 

def f(x) : 
    return x + y 

for i in xrange(2) : 
    y = i 
    pool = mp.Pool(processes = 2) 
    print pool.map(f, xrange(5)) 

pool.close() 
pool.join() 

输出:

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

好吧,这是我所期待的。但是,现在让我们继续前进的pool声明的for循环之外:

y = 10 

def f(x) : 
    return x + y 

pool = mp.Pool(processes = 2) 

for i in xrange(2) : 
    y = i 
    print pool.map(f, xrange(5)) 

输出:

[10, 11, 12, 13, 14] 
[10, 11, 12, 13, 14] 

y新值被忽略!这是怎么回事?

回答

1

https://docs.python.org/2/library/multiprocessing.html

UNIX上的子进程可以利用利用全球资源在 父进程创建的共享资源。但是,最好将 作为参数传递给子进程的构造函数。

通过将名称空间中的所有数据从父级复制到子级名称空间,可以实现此功能(从父级空间访问全局变量)。

所以,当你做

y = i 
pool = mp.Pool(processes = 2) 

子进程得到y为0值(或1,在循环的第二次运行)。

同样,在代码

y = 10 
... 
pool = mp.Pool(processes = 2) 
... 
y = i 

创建子进程时,它得到父母的环境下,y仍然是10的副本,在这种环境中对y任何后来的变化将没有儿童影响处理。