You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 03:22:16