python - multiprocessing.Pool 的奇怪行为,为什么它抓取了错误的函数?

标签 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]

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

最佳答案

这是一个很好的问题,我希望通常在线程(和多处理)方面具有更多知识/经验的人可以出现并给出更好的答案,但这是我的尝试:

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

关于python - multiprocessing.Pool 的奇怪行为,为什么它抓取了错误的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12111616/

相关文章:

python - 使用 PySide 和多处理卡住 GUI

python - 解包元组列表的 dask 延迟对象

Python multiprocessing+logging.FileHandler

Python multiprocessing.Pool 每个变量的新进程

python - 为什么 bool 比较中的赋值会输出这样的结果?

c - MPI:将整数写入和读取文件

python - 切片表示嵌套列表的 NumPy 数组

带有标志的 Python re.sub 不会替换所有出现

python - Rabin-Miller Strong Pseudoprime Test Implementation 将不起作用

python - 如何在opencv python中的图像周围添加边框