在回答"Python 进程池非守护进程?"时,显示了如何禁用进程的守护程序属性:
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
这允许池中的进程启动其自己的子进程,如原始问题中所述。
为了换取启动子流程的灵活性,需要支付哪些成本?如果没有成本,大概标准池将使用非守护进程。
注意:这个问题是基于一个没有解决的高度赞成的评论,所以我决定将其转换为一个问题。
如果守护进程的父进程终止,该进程将被终止。非守护进程将阻止其父进程终止,直到它也终止。
因此,如果您不介意子进程阻止其父进程,则可以随意使用非守护进程。