繁体   English   中英

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

[英]Why the multiprocessing.Pool.map hangs with my custom partial function?

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

(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)
   ...:     

它适用于buildin 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)))
   ...:     

我的自定义部分功能有什么问题?

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

问题是,如docs所述 ,您需要将顶级代码放在__main__块中:

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

否则,池中的每个子进程将尝试创建另外四个孩子的池,然后再执行其他操作。

请注意,这仅在spawnforkserver启动方法中发生-但Windows默认为spawn (其他平台默认为fork ),因此您会遇到这种情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM