回答有关多处理嵌套池的问题:
https://stackoverflow.com/a/40852258/6522112
我提出的代码没有按我想要的方式回应。也就是说,如果ThreadingPool(8)
和ProcessingPool(3)
,我预计进程数量为24,但我只有3!所以我继续使用这个https://stackoverflow.com/a/8963618/6522112,它通过将守护进程标志设置为False来允许嵌套进程池。这很完美,但是:
map
的类型,但似乎只有imap
组合正在完成这项工作。有什么见解吗?以下是使用@MikeMcKerns中的pathos
而非简单多处理的修改代码:
import pathos
import multiprocess
class NoDaemonProcess(multiprocess.Process):
"""NoDaemonProcess class.
Inherit from :class:`multiprocessing.Process`.
``daemon`` attribute always returns False.
"""
def _get_daemon(self):
return False
def _set_daemon(self, value):
pass
daemon = property(_get_daemon, _set_daemon)
class NestedPool(pathos.multiprocessing.Pool):
"""NestedPool class.
Inherit from :class:`pathos.multiprocessing.Pool`.
Enable nested process pool.
"""
Process = NoDaemonProcess
如果你想使用它,要小心,你必须终止内池,否则你最终会得到僵尸:
import NestedPool
def triple(x):
return 3*x
def refork(x):
pool = NestedPool(3)
result = pool.imap(triple, range(5))
result = list(result)
pool.terminate()
return result
pool = NestedPool(8)
result = pool.imap(refork, range(3))