正确的方法来处理
Ctrl+C/
SIGINT用
multiprocessing.Pool是:
SIGINT
在Pool
创建流程之前,请忽略该流程。这样创建的子进程继承了SIGINT
处理程序。- 创建
SIGINT
a之后,在父进程中还原原始处理程序Pool
。 - 使用
map_async
和apply_async
代替阻塞map
和apply
。 - 等待结果超时,因为默认阻塞将等待忽略所有信号。这是Python错误https://bugs.python.org/issue8296。
把它放在一起:
#!/bin/env pythonfrom __future__ import print_functionimport multiprocessingimport osimport signalimport timedef run_worker(delay): print("In a worker process", os.getpid()) time.sleep(delay)def main(): print("Initializng 2 workers") original_sigint_handler = signal.signal(signal.SIGINT, signal.SIG_IGN) pool = multiprocessing.Pool(2) signal.signal(signal.SIGINT, original_sigint_handler) try: print("Starting 2 jobs of 5 seconds each") res = pool.map_async(run_worker, [5, 5]) print("Waiting for results") res.get(60) # Without the timeout this blocking call ignores all signals. except KeyboardInterrupt: print("Caught KeyboardInterrupt, terminating workers") pool.terminate() else: print("Normal termination") pool.close() pool.join()if __name__ == "__main__": main()
正如@YakovShklarov指出的那样,在父进程中忽略信号和忽略信号之间存在时间窗口,在此期间信号可能会丢失。
pthread_sigmask在父进程中使用临时阻止信号的传递可以防止信号丢失,但是在Python-2中不可用。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)