Twisted - 在DeferredList中停止所有延迟

时间:2014-12-12 11:17:16

标签: python twisted deferred

我在 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)

1 个答案:

答案 0 :(得分:2)

Deferreds没有运行操作。你无法阻止延期。您可以使用Deferred.cancel API尝试停止与Deferred关联的操作,但这是一种选择加入机制:操作必须明确启用取消或{{1}实际上不会停止操作。

Python中的线程不可中断。因此,从Deferred.cancel返回的Deferred不会选择加入取消机制。你无法阻止基础操作。

您可以为您的工作人员实现自己的中断机制。例如,您可以在主线程和工作线程函数之间共享deferToThread实例。如果要停止线程,请设置事件。在worker函数中,不时检查事件以查看是否已设置。如果是这样,就放弃这份工作。