【问题标题】:In python, how can I check if a child process exited cleanly or with an error?在python中,如何检查子进程是否干净退出或出现错误?
【发布时间】:2020-03-05 04:45:02
【问题描述】:

我有一些这样的代码

import multiprocessing as mp

processes = []
for i in range(10):
  p = mp.Process(target=my_func, args=args)
  processes.append(p)
  p.start()

for p in processes:
  p.join()

如果my_func 中存在导致所有线程崩溃的错误,那么我希望我的父进程能够检测到该错误并抛出异常。加入进程时如何检测进程是否干净退出?

【问题讨论】:

  • 你得到什么异常?
  • 不管我得到什么异常。我一直在 my_func 函数中制造错误,它导致线程退出并且程序继续。我想要的是如果线程退出时出现异常,那么主进程也可以检测到它并退出。

标签: python python-multiprocessing


【解决方案1】:

读取进程的值'exitcode:

  • None 如果该过程尚未完成。
  • 0 如果进程成功结束。
  • N 如果进程出错,并以代码 N 退出。
  • -N 如果进程被信号N 杀死。 (例如,-15 如果被SIGTERM 杀死)

例如,在你的主进程中:

for p in processes:
    p.join()
    if p.exitcode > 0:
        raise ValueError(f'a process exited with code {p.exitcode}')

在你的可运行文件中:

try:
    do_something()
except KnownError as _:
    exit(my_known_error_code)

【讨论】:

    【解决方案2】:

    调用join()后可以查看退出码。

    例如:

    for p in processes:
      p.join()
      if p.exitcode is not 0:
        exit(1)
    

    参考:

    【讨论】:

      猜你喜欢
      • 2015-07-06
      • 1970-01-01
      • 2012-06-01
      • 1970-01-01
      • 2021-12-30
      • 2023-01-11
      • 1970-01-01
      • 2011-08-29
      • 2019-06-10
      相关资源
      最近更新 更多