回答有关用于多处理的嵌套池的问题:
https://stackoverflow.com/a/40852258/6522112
我提出的代码没有按照我想要的方式响应。也就是说 ifThreadingPool(8)
和ProcessingPool(3)
,我预计进程数是 24,但我只有 3 个!所以我继续使用这个https://stackoverflow.com/a/8963618/6522112,它通过将守护进程标志设置为 False 来允许嵌套进程池。这非常有效,但是:
- 只得到 3 个进程而不是 24 个进程是否正常?
- 我用这个黑客做对了吗?
- 最终目标是使用集群上的多个节点来执行此操作。这会阻止它吗?
- 我不确定
map
要考虑的类型,但似乎只有imap
组合才能发挥作用。有什么见解吗?
这是使用pathos
来自@MikeMcKerns 而不是简单的多处理的修改后的代码:
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))