【问题标题】:Python multiprocessing: exit on error in any processPython多处理:在任何进程中出错时退出
【发布时间】:2022-11-17 20:05:51
【问题描述】:
import time
from multiprocessing import Process


def possible_error_causer(a, b):
    time.sleep(5)
    c = a / b
    print(c)
    time.sleep(100)


for i in range(3):
    p = Process(target=possible_error_causer, args=(i, i))
    p.start()

上面的代码将在接收 0, 0 作为参数的进程发生异常后执行(将在 100 秒后运行)。但我希望脚本在任何过程出现错误时停止。 Try except 不是一个选项(except 中的 sys.exit()),因为它不会捕获所有外部错误(例如,它不会捕获一些 OpenCV 错误)

【问题讨论】:

标签: python multiprocessing python-multiprocessing


【解决方案1】:

我并没有完全成功,因为我可能需要在主线程中收集进程对象,然后通过 Queue 将它们传递给子进程,并在 except 之后调用终止它们(是的,我放弃了除了 try except,sys. excepthook 对我不起作用)。

但是,由于我不需要异步完全是多处理,所以我只是将其替换为 threading.Thread 并在 except 中调用了 os._exit(1)

import sys
import time
import os
from threading import Thread


def myexcepthook(*args):
    # Meant for sys.excepthook in multiprocessing script, but didn't work
    print("My except worked")


def possible_error_causer(a, b):
    try:
        time.sleep(5)
        c = a / b
        print(c)
        time.sleep(100)
    except:
        os._exit(1)



for i in range(3):
    p = Thread(target=possible_error_causer, args=(i, i))
    p.start()

【讨论】:

    【解决方案2】:

    您正在执行除以零。实际上,在对子进程的第一次调用中,您传递了 (, i, ),它转换为 a = ib = i 以及 i = 0

    要解决此问题,您可以:

    • 将范围更改为range(1, 4),以便从 1 迭代到 4 排除。
    • 将 b args=(i, i+1) 加一以确保除数不为 0。

    【讨论】:

      猜你喜欢
      • 2020-03-04
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      • 2015-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-08
      相关资源
      最近更新 更多