我试图理解多处理和全局变量。我试图在3个不同的地方声明pool
:
import multiprocessing as mp
# 1) AttributeError: 'module' object has no attribute 'f'
#pool = mp.Pool( processes = 2 )
def f(x) :
print x
# 2) no error
pool = mp.Pool( processes = 2 )
a = range(5)
# 3) no error
#pool = mp.Pool( processes = 2 )
pool.map( f, a)
pool.close()
pool.join()
我的理解是,行pool = ...
产生子进程,它包含自己的父变量,直到父代码中的那一行为止。他们无法访问该行之后声明的全局变量。因此,预期1)中的AttributeError。子进程对f
一无所知,因为它在父代码中被进一步声明。
然而,我确信我理解为什么2)有效。 pool.map
同时使用f
和a
。为什么儿童流程无法了解a
,而他们需要了解f
?