Python进程池非守护进程?
是否有可能创build一个非守护进程的Python池? 我想要一个池可以调用一个内部有另一个池的函数。 谢谢。
multiprocessing.pool.Pool
类在其__init__
方法中创build工作进程,使其成为守护进程并启动它们,并且在启动之前不能将它们的daemon
属性重新设置为False
(并且之后不再允许)。 但是你可以创build你自己的multiprocesing.pool.Pool
的子类( multiprocessing.Pool
只是一个包装函数)并且替代你自己的multiprocessing.Process
子类,它总是非守护的,用于工作进程。
这里有一个如何做到这一点的完整例子。 最重要的部分是顶层的两个类NoDaemonProcess
和MyPool
,最后在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。