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

时间:2016-12-02 14:57:03

标签: python parallel-processing python-multiprocessing pathos

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

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

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

  1. 仅获得3个流程而不是24个流程是否正常?
  2. 我是否正确使用此黑客攻击?
  3. 最终目标是使用群集上的多个节点来执行此操作。这会阻止它吗?
  4. 我不确定要考虑map的类型,但似乎只有imap组合正在完成这项工作。有什么见解吗?
  5. 以下是使用@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))
    

0 个答案:

没有答案