在多处理循环中捕获异常

Catching exceptions in a multiprocessing loop

是否可以在 concurrent.futures.Executor 的可调用对象中捕获循环引发的异常? --

with concurrent.futures.ThreadPoolExecutor(max_workers=num_cores) as executor:
    futures = {executor.submit(self._process_ticket, i) for i in items}
    concurrent.futures.wait(futures)

我正在尝试遍历列表中的数千个对象以执行任务,并设置多处理以更快地处理它们。这很好用,但是由于我正在处理的对象,在此过程中可能会从 for 循环中引发异常,并且因为它被 concurrent.futures.Executor 调用,所以我无法捕获就像我以前捕捉它的方式一样。

下面是我之前如何通过序列化进程捕获异常的简单示例。我必须创建一个解决方法来强制迭代再次尝试处理对象并从该步骤继续向前,因为异常导致循环停止:

def task(self, items, step=None):
    # items = [list,of,many,objects]
    try:
        for i in range(0 if step is None else step, len(items)):
            with app.app_context():
                ## do things with items[i]..
    except Exception as e:
        self.task(items, i)

我基本上是想在循环被异常中断的情况下强制再次处理对象并从该步骤继续循环。

没关系,几天前就弄明白了。不确定这是否是 best/recommended 完成这项工作的方法,但它似乎完成了工作:

with concurrent.futures.ThreadPoolExecutor(max_workers=num_cores) as executor:
    try:
        for i in range(step, len(items)):
            futures = {executor.submit(self.task, items[i])}
    except:
        self.task(items, i)

    concurrent.futures.wait(futures)

还有 suggestions/advice

开放