【问题标题】:How to stop multiprocess python-program cleanly after exception?异常后如何干净地停止多进程python程序?
【发布时间】:2011-11-25 11:46:21
【问题描述】:

我有一个 Python 程序,它有多个进程(目前只有 2 个)和线程(每个进程 2 个)。我想捕捉每一个异常,特别是在 Ctrl+c 上干净地关闭我的程序,但我无法让它工作。每次发生异常时,程序都会停止但无法正确关闭,导致命令行无法使用。

到目前为止我在伪代码中尝试过的是:

try:
    for process in processes:
        process.join()
except:
    pass #Just to suppress error-messages, will be removed later
finally:
    for process in processes:
        process.terminate()

但正如我已经说过的,没有运气。另请注意,我收到两个进程的异常错误消息,所以我相信它们都已停止?

也许我还应该提到,大多数线程在监听管道时都被阻塞了。

编辑 所以我几乎让它工作了。我需要try: 每个线程并确保线程正确连接。只有一个缺陷:关闭时Exception KeyboardInterrupt in <module 'threading' from '/usr/lib64/python2.7/threading.pyc'> ignored。这是在主进程的主线程中提出的。这个线程已经结束了,意味着它已经通过了最后一行代码。

【问题讨论】:

  • 大概主进程中的主线程是您等待加入所有其他进程(和线程)的地方。那正确吗?如果是这样,那么它应该总是最后完成。你是按 CTRL-C 来提高 KeyboardInterrupt 吗?如果是这样,那么您最好使用信号处理程序来捕获 SIG_INT 并指示您的其他线程和进程终止。

标签: python exception-handling multiprocessing


【解决方案1】:

问题(我预计)是在进程内部引发异常而不是在加入调用中。

我建议您尝试将每个进程的 main 方法包装在 try-except 循环中。然后有一个标志(例如 multiprocessing.Value 的实例),将 except 语句设置为 False。每个进程都可以检查标志的值,如果设置为 False,则停止(自行清理)。

注意,如果您只是终止一个进程,它不会自行清理,因为这与向它发送 SIG_TERM 相同。

【讨论】:

  • 我已经将每个进程包装到一个 try 块中,但是这些进程是多线程的,所以我可能还需要包装线程。我认为在最后的声明中清理应该没问题。至于 SIG_TERM:Cleanly for now 意味着我没有僵尸,稍后这可能意味着清理操作。我现在想要的只是关闭每个进程,这在我当前的程序中不会发生。
  • 你能更新你的帖子更详细一点吗,例如异常是什么以及在哪里引发?
  • 异常类型并不重要,因为在这个级别上,任何异常都应该触发关闭。至于它在哪里提出,我将在我的问题中进行编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
  • 1970-01-01
  • 2017-06-17
  • 2013-05-22
  • 1970-01-01
  • 2010-09-10
  • 1970-01-01
相关资源
最近更新 更多