Python进程池非守护进程?

是否有可能创build一个非守护进程的Python池? 我想要一个池可以调用一个内部有另一个池的函数。 谢谢。

multiprocessing.pool.Pool类在其__init__方法中创build工作进程,使其成为守护进程并启动它们,并且在启动之前不能将它们的daemon属性重新设置为False (并且之后不再允许)。 但是你可以创build你自己的multiprocesing.pool.Pool的子类( multiprocessing.Pool只是一个包装函数)并且替代你自己的multiprocessing.Process子类,它总是非守护的,用于工作进程。

这里有一个如何做到这一点的完整例子。 最重要的部分是顶层的两个类NoDaemonProcessMyPool ,最后在MyPool实例上调用pool.close()pool.join()

 #!/usr/bin/env python # -*- coding: UTF-8 -*- import multiprocessing # We must import this explicitly, it is not imported by the top-level # multiprocessing module. import multiprocessing.pool import time from random import randint class NoDaemonProcess(multiprocessing.Process): # make 'daemon' attribute always return False def _get_daemon(self): return False def _set_daemon(self, value): pass daemon = property(_get_daemon, _set_daemon) # We sub-class multiprocessing.pool.Pool instead of multiprocessing.Pool # because the latter is only a wrapper function, not a proper class. class MyPool(multiprocessing.pool.Pool): Process = NoDaemonProcess def sleepawhile(t): print("Sleeping %i seconds..." % t) time.sleep(t) return t def work(num_procs): print("Creating %i (daemon) workers and jobs in child." % num_procs) pool = multiprocessing.Pool(num_procs) result = pool.map(sleepawhile, [randint(1, 5) for x in range(num_procs)]) # The following is not really needed, since the (daemon) workers of the # child's pool are killed when the child is terminated, but it's good # practice to cleanup after ourselves anyway. pool.close() pool.join() return result def test(): print("Creating 5 (non-daemon) workers and jobs in main process.") pool = MyPool(5) result = pool.map(work, [randint(1, 5) for x in range(5)]) pool.close() pool.join() print(result) if __name__ == '__main__': test() 

多处理模块有一个很好的接口来使用进程线程池。 根据你当前的用例,你可能会考虑为你的外部池使用multiprocessing.pool.ThreadPool ,这将导致线程(允许从内部产生进程)而不是进程。

它可能会受到GIL的限制,但在我个人的情况下(我testing了两者) , 这里创build的来自外部Pool的进程的启动时间远远超过ThreadPool的解决scheme。


交换Threads Processes真的很容易。 阅读更多关于如何在这里或这里使用ThreadPool解决scheme。