2

回答有关用于多处理的嵌套池的问题:

https://stackoverflow.com/a/40852258/6522112

我提出的代码没有按照我想要的方式响应。也就是说 ifThreadingPool(8)ProcessingPool(3),我预计进程数是 24,但我只有 3 个!所以我继续使用这个https://stackoverflow.com/a/8963618/6522112,它通过将守护进程标志设置为 False 来允许嵌套进程池。这非常有效,但是:

  1. 只得到 3 个进程而不是 24 个进程是否正常?
  2. 我用这个黑客做对了吗?
  3. 最终目标是使用集群上的多个节点来执行此操作。这会阻止它吗?
  4. 我不确定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))
4

0 回答 0