【问题标题】:Twisted - Stop all Deferred in DeferredListTwisted - 停止 DeferredList 中的所有 Deferred
【发布时间】:2014-12-12 11:17:16
【问题描述】:

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

【问题讨论】:

    标签: python twisted deferred


    【解决方案1】:

    Deferred 不是正在运行的操作。你不能停止延期。您可以使用Deferred.cancel API 来尝试停止与Deferred 关联的操作,但这是一种选择加入机制:操作必须显式启用取消,否则Deferred.cancel 实际上不会停止操作。

    Python 中的线程是不可中断的。从deferToThread 返回的Deferred 因此不会选择取消机制。您无法停止底层操作。

    您可以为工作函数实现自己的中断机制。例如,您可以在主线程和工作函数之间共享一个threading.Event 实例。如果您希望线程停止,请设置事件。在worker函数中,时不时检查一下事件,看是否设置了。如果是这样,请放弃这份工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-16
      • 2018-12-03
      • 2019-10-17
      相关资源
      最近更新 更多