多处理的奇怪行为.Pool,为什么它会抓错函数?

时间:2012-08-24 14:42:51

标签: python multiprocessing

我不理解Python multiprocessing.Pool在这种情况下的行为:

import multiprocessing

def f(x): return x
P = multiprocessing.Pool()
def f(x): return x*x

print (P.map(f, range(10)))
print (  map(f, range(10)))

导致输出:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

在调用print语句时,是不是只有一个f?为什么Pool抓住f的第一个实例?我希望P.mapmap输出相同的结果!

1 个答案:

答案 0 :(得分:3)

这是一个很好的问题,我希望那些在线程(和多处理)方面有更多知识/经验的人能够出现并提供更好的答案,但这是我的尝试:

这里没有真正深入研究细节(在快速查看源代码之后),Pool构造函数似乎会产生多个线程来处理任务队列。这些线程似乎只是坐在那里寻找要放入其中的东西。因此,看起来当线程获得运行函数__main__.f的请求时,它确实如此,因为它从未见过__main__.f的更新定义,它使用旧的定义。