信号是由子进程处理的,而不是由父进程处理的



我生成了几个multiprocessing.Process来将工作负载共享到不同的进程上。现在,我希望能够通过按下Ctrl-C来关闭整个程序,但信号只发送给子进程,而不发送给父进程。

我的程序是这样的:

import sys
import multiprocessing
import signal
# ignoring handler, signal.SIG_IGN is not working on windows
def sighandler(signal, frame):
pass    
# worker thread definiton
def worker():
signal.signal(signal.SIGINT, sighandler)
signal.signal(signal.SIGTERM, sighandler)
# do stuff here...
def main():
num_procs = 4
procs = []
print("Starting up %d processes:" %num_procs)
for i in range(num_procs):
print("tstarting worker %d..." %(i+1))
p = multiprocessing.Process(target=worker)
procs.append(p)
p.start()
print("All processes started...")
try:
for p in procs:
p.join()
except KeyboardInterrupt as e:
print "STOPPING"
for p in procs:
p.terminate()
sys.exit(0)

但是如果我按ctrl-c,只有sighandler被调用4次。当我在父进程中注册信号时,处理程序不会被调用,KeyboardInterrupt异常也不会工作。我可以从内部停止子进程吗?处理程序中的sys.exit(0)对我不起作用。

您尝试过使用os._exit(n)吗?

来自文档:

退出状态为n的进程,无需调用清理处理程序、刷新stdio缓冲区等。

可用性:Unix、Windows。

注意退出的标准方法是sys.exit(n)_exit()通常只应在fork()之后的子进程中使用。

http://docs.python.org/2/library/os.html#os._exit

最新更新