为什么Python的ThreadPoolExecutor禁止所有异常,以及如何解决此异常?

时间:2019-11-08 08:49:24

标签: python exception threadpoolexecutor

我对Python来说还比较陌生,但是我很难理解该池的行为。我曾尝试在stackoverflow上查看类似的问题,但在理解这个问题时仍然遇到困难。

例如,如果我们使用执行器:     使用ThreadPoolExecutor(8)作为池:         pool.map(doSomething,test_list)

所有在池中发生的错误都将被抑制而不显示。

有没有可用的参数,以便池停止执行并显示异常?

谢谢!

1 个答案:

答案 0 :(得分:0)

我发现自己可以间接解决此问题。它实际上很简单,所以如果有人遇到此问题,我想在这里发布。我不知道它是否非常聪明,但是对我来说,这种解决方案很好。

首先要感谢@artiom,正如他已经说过的,最好直接在并行化函数中捕获错误。

现在是“旁路”:

在整个代码中的函数内除try块外,并使用

捕获所有异常
  

except Exception as e:

。 可以将异常简单地记录在except块中,例如,使用哨兵或其他记录框架。这样,您至少可以再次查看引发的异常,并修复代码中的错误。

简单的例子:

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)