【问题标题】: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 = i 和 b = i 以及 i = 0。
要解决此问题,您可以:
- 将范围更改为
range(1, 4),以便从 1 迭代到 4 排除。
- 将 b
args=(i, i+1) 加一以确保除数不为 0。