3

我不明白 Pythonmultiprocessing.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]

在调用打印语句的地方,不是只有一个f吗?为什么 Pool 会抓取 的第一个实例f?我希望这一点P.mapmap输出相同的结果!

4

1 回答 1

3

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

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

于 2012-08-24T14:58:30.903 回答