我产生了几个multiprocessing.Process
es以将工作负载分配到不同的proc上。
现在我希望能够通过按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)
对我不起作用。
答案 0 :(得分:0)
您是否尝试过使用os._exit(n)
?
来自文档:
退出状态为n的进程,不调用清理处理程序,刷新stdio缓冲区等。
可用性:Unix,Windows。
注意退出的标准方法是sys.exit(n)。通常只应在fork()之后的子进程中使用_exit()。