【问题标题】:Implement Ctrl+C cancelling in python multiprocessing在python多处理中实现Ctrl+C取消
【发布时间】:2013-08-21 11:13:01
【问题描述】:

我一直在使用以下方法在python中实现并行子进程:

pool = multiprocessing.Pool(processes=4)
pool.map_async(my_parallel_func ....)
pool.close()
pool.join()

这些任务将运行几分钟。而且我注意到在pool.join() 阻塞等待期间,我无法按 Ctrl+c 取消主脚本。如果我按Ctrl+c,我会得到一个堆栈打印,程序并没有停止,但它会变成一个僵尸进程。我必须手动杀死每个子进程。

如何让程序通过Ctrl+c退出,同时终止所有子进程?

【问题讨论】:

  • 子进程必须被告知单独关闭。请参阅here 以获得一些指导。

标签: python multiprocessing


【解决方案1】:

问题是 Ctrl+c 只从执行异步映射的池中杀死一个进程;一旦它被杀死,管理器就会使用新进程重新生成任务。你需要做的是在my_parallel_func 的顶层有一个except KeyboardInterrupt:,然后这可以通过对主进程的一些特殊值告诉整个进程树应该死。

【讨论】:

  • 将异常放入my_parallel_func 是行不通的。实际上是 pool.join() 在等待。我想知道如果没有进程间通信这是否可能?
  • 在我的电脑 linux 3.8 上,ctrl+c 会从处理池中杀死 1 个进程...所以它似乎有所不同...
猜你喜欢
  • 1970-01-01
  • 2020-08-15
  • 2011-05-11
  • 1970-01-01
  • 2018-06-30
  • 2013-02-25
  • 1970-01-01
  • 2022-07-04
  • 2021-03-12
相关资源
最近更新 更多