Python 如何使用嵌套池将所有CPU与pathos一起使用

Python 如何使用嵌套池将所有CPU与pathos一起使用,python,parallel-processing,python-multiprocessing,pathos,Python,Parallel Processing,Python Multiprocessing,Pathos,回答有关用于多处理的嵌套池的问题: import pathos import multiprocess class NoDaemonProcess(multiprocess.Process): """NoDaemonProcess class. Inherit from :class:`multiprocessing.Process`. ``daemon`` attribute always returns False. """ def _ge

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

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

我提出的代码没有按照我想要的方式响应。也就是说,如果
ThreadingPool(8)
ProcessingPool(3)
,我希望进程的数量是24个,但我只得到了3个!所以我继续使用它,通过将守护进程标志设置为False,它允许嵌套进程池。这很好,但是:

  • 只有3个进程而不是24个进程是正常的吗
  • 我用这个黑客做得对吗
  • 最终目标是使用集群上的多个节点来实现这一点。这能阻止它吗
  • <> Li >我不确定要考虑的代码类型>图>代码>,但是似乎只有<代码> 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))