python multiprocessing daemon失效的原因

今天写个常驻服务,使用了multiprocessing库,新的process设置了daemon属性,想通过signal来主动关闭服务,主进程进行了信号绑定,代码如下:

def handler(signum, frame):
   logger.info("got signal:%d" % signum)
   global quit
   quit = True

signal.signal(signal.SIGINT, handler)
signal.signal(signal.SIGTERM, handler)

这样设置后,发现Ctrl+C后,父子进程均收到了信号,但是子进程并没有终止,父进程也hang住了。

查看日志,发现在子进程收到signum为2(signal.SIGINT)的信号后,又收到了15(signal.SIGTERM),这说明daemon属性设置是为了父进程往子进程发送15的信号,但是如果15也被主动捕获了,导致默认处理15的退出逻辑并没有再执行,而父进程没有收到子进程的退出状态,也hang住了,将15的捕获删除后,符合预期。

你可能感兴趣的:(python multiprocessing daemon失效的原因)