如何用Ctrl+C终止Python 3.10中的multiprocessing.Pool进程池?
解决Python多进程Pool中Ctrl+C无法及时中断的问题
问题根源
Pool.map()会阻塞主进程,直到所有子进程完成任务后才会返回。这导致按下Ctrl+C触发的KeyboardInterrupt只有在所有子进程结束后才会被主进程捕获,无法满足立即中断的需求。
简洁解决方案
使用Pool.imap()替代map(),配合信号处理和异常捕获,让主进程能及时响应中断并终止所有子进程:
from multiprocessing import Pool import signal def f(x): while True: pass if __name__ == '__main__': pool = Pool(2) # 定义信号处理函数,收到中断时终止所有进程 def handle_sigint(signum, frame): print("\n正在终止所有进程...") pool.terminate() pool.join() exit(1) # 注册SIGINT信号处理 signal.signal(signal.SIGINT, handle_sigint) try: # 用imap迭代结果,让主进程有机会响应信号 for _ in pool.imap(f, [1, 2]): pass except KeyboardInterrupt: # 双重保险,确保中断被捕获后清理进程 pool.terminate() pool.join()
方案说明
imap()是迭代器式的任务执行方法,主进程会在每次迭代时检查信号,而非一直阻塞到所有任务完成,这样Ctrl+C能被及时捕获。- 注册
SIGINT信号处理函数,主动终止所有子进程并释放资源,避免卡顿。 - 外层的
try-except作为双重保险,确保即使信号处理出现遗漏,也能正确处理中断。
内容的提问来源于stack exchange,提问作者Nanilla
相关产品推荐
相关产品推荐

