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

Eas*_*sun 2 python multiprocessing python-3.x

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

(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)
   ...:     
Run Code Online (Sandbox Code Playgroud)

它适用于构建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]
Run Code Online (Sandbox Code Playgroud)

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

In [4]: from multiprocessing import Pool

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

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

aba*_*ert 6

这与您的自定义部分功能无关。

\n\n

问题是,正如文档中所解释的,您需要将顶级代码放在__main__块中:

\n\n
if __name__ == \'__main__\':\n    with Pool(4) as pool:\n        list(pool.map(SecPartialF(f, 10), range(10)))\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

请注意,这只发生在spawnforkserverstart 方法\xe2\x80\x94 上,但 Windows 默认为spawn(其他平台默认为fork),所以它会发生在你身上。

\n