为什么 Python ThreadPoolExecutor 会抑制所有异常以及如何解决这个问题?
Why does Pythons ThreadPoolExecutor supress all Exceptions and how to fix this?
我对 Python 比较陌生,我很难理解这个池的行为。我试图在 Whosebug 上查看类似的问题,但我仍然难以理解这个问题。
例如,如果我们使用执行器:
以 ThreadPoolExecutor(8) 作为池:
pool.map(doSomething,test_list)
池中发生的所有错误都被抑制而不显示。
是否有可用的参数使池停止执行并显示异常?
提前致谢!
我自己找到了一个可以间接规避这个问题的可能性。它实际上非常简单,所以如果其他人遇到这个问题,我想在这里发布它。我不知道它是否很聪明,但对我来说这个解决方案很好。
首先感谢@artiom,正如他所说,最好直接在并行函数中捕获错误。
现在 "bypass":
在整个代码周围的函数内放置一个 try except 块,并使用
捕获所有异常
except Exception as e:
。
异常简单地记录在 except 块中,例如使用 sentry 或其他日志框架。这样,您至少可以再次查看抛出的异常并修复代码中的错误。
简单示例:
def for_parallel(chunk):
for one in chunk:
try:
a = 1
foo(one['bla'])
doSomething(one['blu'])
except Exception as e:
sentry.capture_exception(e)
def main():
with ThreadPoolExecutor(8) as pool:
pool.map(for_parallel, my_list)
我对 Python 比较陌生,我很难理解这个池的行为。我试图在 Whosebug 上查看类似的问题,但我仍然难以理解这个问题。
例如,如果我们使用执行器: 以 ThreadPoolExecutor(8) 作为池: pool.map(doSomething,test_list)
池中发生的所有错误都被抑制而不显示。
是否有可用的参数使池停止执行并显示异常?
提前致谢!
我自己找到了一个可以间接规避这个问题的可能性。它实际上非常简单,所以如果其他人遇到这个问题,我想在这里发布它。我不知道它是否很聪明,但对我来说这个解决方案很好。
首先感谢@artiom,正如他所说,最好直接在并行函数中捕获错误。
现在 "bypass":
在整个代码周围的函数内放置一个 try except 块,并使用
捕获所有异常
except Exception as e:
。 异常简单地记录在 except 块中,例如使用 sentry 或其他日志框架。这样,您至少可以再次查看抛出的异常并修复代码中的错误。
简单示例:
def for_parallel(chunk):
for one in chunk:
try:
a = 1
foo(one['bla'])
doSomething(one['blu'])
except Exception as e:
sentry.capture_exception(e)
def main():
with ThreadPoolExecutor(8) as pool:
pool.map(for_parallel, my_list)