gpt4 book ai didi

python - 为什么 multiprocessing.Pool.map 与我的自定义部分函数一起挂起?

转载 作者:行者123 更新时间:2023-12-01 01:55:12 25 4
gpt4 key购买 nike

我制作了一个自定义部分函数,​​如下所示:

(Python 3.6.5 |Anaconda 自定义(64 位)| (默认,2018 年 3 月 29 日,13:32:41)[MSC v.1900 64 位 (AMD64)])

In [1]: class SecPartialF(object):
...: def __init__(self, func, arg1):
...: self.func, self.arg1 = func, arg1
...: def __call__(self, arg2):
...: return self.func(self.arg1, arg2)
...:

它适用于内置 map :

In [2]: def f(x, y):
...: print(x, y)
...: return x + y

In [3]: list(map(SecPartialF(f, 10), range(10)))
10 0
10 1
10 2
10 3
10 4
10 5
10 6
10 7
10 8
10 9
Out[3]: [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

但是,它不适用于多处理。 pool.map 挂起并且没有任何输出:

In [4]: from multiprocessing import Pool

In [5]: with Pool(4) as pool:
...: list(pool.map(SecPartialF(f, 10), range(10)))
...:

我的自定义部分函数有什么问题?

最佳答案

这与您的自定义部分函数无关。

问题在于,正如 the docs 中所解释的那样,您需要将顶级代码放在 __main__ block 中:

if __name__ == '__main__':
with Pool(4) as pool:
list(pool.map(SecPartialF(f, 10), range(10)))

否则,池中的每个子进程将在执行任何其他操作之前尝试创建另一个包含 4 个子进程的池。

请注意,这只发生在 spawnforkserver 启动方法中,但 Windows 默认为 spawn(其他平台默认为 fork),所以它发生在你身上。

关于python - 为什么 multiprocessing.Pool.map 与我的自定义部分函数一起挂起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50283660/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com