在多处理循环中捕获异常

2024-04-26 20:39:58 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有可能在可从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)

我基本上是想在循环被异常中断的情况下强制再次处理一个对象,然后从该步骤开始继续循环。你知道吗


Tags: 对象inselfnonefortaskasstep
1条回答
网友
1楼 · 发布于 2024-04-26 20:39:58

没关系,我几天前就知道了。不确定这是否是完成任务的最佳/推荐方法,但似乎可以完成任务:

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)

仍在征求建议/意见

相关问题 更多 >