我有以下简化示例:
#!/usr/bin/python
import logging, logging.handlers
from multiprocessing import Process, Queue
import time, sys, signal
def child_proc(sleepr):
print 'Child: Started child, waiting'
time.sleep(sleepr)
print 'Child: Ended sleep, exiting'
def cleanup(a, b):
print 'Main: Got SIGTERM: ' + str(a) + ' : ' + str(b)
print 'Main: Starting process'
child_proc_th = Process(target=child_proc, args=(3,))
child_proc_th.start()
print 'Main: Pausing main thread'
signal.signal(signal.SIGTERM, cleanup)
signal.pause()
print 'Main: Running again after pause'
为什么在child_proc完成后signal.pause会恢复?如果收到sigterm,我只希望它恢复... child_proc是否将堆栈的退出信号发送到父进程?还是有另一种方法可以做到这一点......?
TIA
答案 0 :(得分:0)
signal.pause()
阻止,直到收到任何信号。当孩子退出时,它会向父母发送SIGCHLD
。这会导致signal.pause()
返回。
据我所知,为了达到你想要的效果,你必须在循环中signal.pause()
,直到收到正确的信号。
这样的事情:
sigtermreceived = False
def sigterm(signum, frame):
global sigtermreceived
sigtermreceived = True
signal.signal(signal.SIGTERM, sigterm)
while not sigtermreceived:
signal.pause()
请注意,还有Process.join()
:
child_proc_th = Process(target=child_proc, args=(3,))
child_proc_th.start()
child_proc_th.join()
这将阻止子进程退出。这基本上就是你现在的行为,但没有弄乱信号。