我在 DeferredList 中有一些任务,有时工人可能会抛出一些错误。如何阻止 DeferredList 中的所有 Deferrs ?如果工人出了问题
def worker(word): #can throw Exception return word.upper() def worker_err(error): #todo: stop all deffered in list return 0 def processing(words): workers_list = [] for word in words: workers_list.append(threads.deferToThread(worker, words).addErrback(worker_err)) return defer.DeferredList(workers_list) words = ['abc', 'test string', 'test'] d = processing(words)
答案 0 :(得分:2)
Deferreds没有运行操作。你无法阻止延期。您可以使用Deferred.cancel
API尝试停止与Deferred
关联的操作,但这是一种选择加入机制:操作必须明确启用取消或{{1}实际上不会停止操作。
Python中的线程不可中断。因此,从Deferred.cancel
返回的Deferred
不会选择加入取消机制。你无法阻止基础操作。
您可以为您的工作人员实现自己的中断机制。例如,您可以在主线程和工作线程函数之间共享deferToThread
实例。如果要停止线程,请设置事件。在worker函数中,不时检查事件以查看是否已设置。如果是这样,就放弃这份工作。