如何在多进程 Python 程序中捕获 Ctrl+C 并优雅地退出所有进程,我需要的解决方案要在 Unix 和 Windows 上都能工作。我尝试了以下方法:
import multiprocessing
import time
import signal
import sys
jobs = []
def worker():
signal.signal(signal.SIGINT, signal_handler)
while(True):
time.sleep(1.1234)
print "Working..."
def signal_handler(signal, frame):
print 'You pressed Ctrl+C!'
# for p in jobs:
# p.terminate()
sys.exit(0)
if __name__ == "__main__":
for i in range(50):
p = multiprocessing.Process(target=worker)
jobs.append(p)
p.start()
现在它已经有点能用了,但我认为这不是正确的解决方案。
maxtasksperchild
池参数,它将无法工作。新创建的进程会再次继承标准的SIGINT
处理程序。pebble库默认禁用用户的SIGINT
信号,一旦创建了新进程就会生效。 - noxdafoxsignal.signal(signal.SIGINT, signal.SIG_IGN)
返回先前配置的信号。 - Chen A.