【发布时间】:2019-06-08 22:28:30
【问题描述】:
我有一个 ProcessPoolExecutor 并想在其中引发一个自定义异常。但它只有在具有默认参数或在超级初始化中使用或只是绕过该超级初始化函数时才可以在不破坏进程池的情况下工作。
我对这种行为一无所知。
在 Py3.7 和 3.8 上显示如下:
A process in the process pool was terminated abruptly while the future was running or pending.
有什么想法吗?
from concurrent.futures.process import ProcessPoolExecutor
class PoolBreaker(Exception):
def __init__(self, num):
super().__init__()
self.num = num
class NoPoolBreaker(Exception):
def __init__(self, num=0):
super().__init__()
self.num = num
class NoPoolBreaker2(Exception):
def __init__(self, num):
super().__init__(num)
self.num = num
class NoPoolBreaker3(Exception):
def __init__(self, num):
self.num = num
def get_result(job):
exc = job.exception()
if type(exc) is PoolBreaker:
print("PoolBreaker", exc.num)
elif type(exc) is NoPoolBreaker:
print("NoPoolBreaker", exc.num)
elif type(exc) is NoPoolBreaker2:
print("NoPoolBreaker2", exc.num)
elif type(exc) is NoPoolBreaker3:
print("NoPoolBreaker3", exc.num)
else:
print(f"Exception: {str(exc)}")
def work(x: int):
if x == 0:
raise PoolBreaker(x)
elif x == 1:
raise NoPoolBreaker(x)
elif x == 2:
raise NoPoolBreaker2(x)
elif x == 3:
raise NoPoolBreaker3(x)
if __name__ == '__main__':
for num in range(0, 4):
with ProcessPoolExecutor() as executor:
job = executor.submit(work, num)
get_result(job)
【问题讨论】:
标签: python multithreading exception