是否可以在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)
我基本上是想在循环被异常中断的情况下强制再次处理对象,并从该步骤继续执行循环。
答案 0 :(得分:1)
没关系,几天前就想到了这一点。不知道这是否是完成此任务的最佳/推荐方法,但似乎可以完成此工作:
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)
仍然开放征求意见/建议