【发布时间】:2018-04-25 08:05:51
【问题描述】:
twisted.internet.defer.DeferredList 这样做:
我将一组延迟合并到一个回调中。
我为他们的回调跟踪了一个 Deferred 列表,并制作了一个 全部完成后回调,(成功,结果)列表 元组,“成功”是一个布尔值。
请注意,在将 Deferred 放入 延迟列表。例如,您可以在 通过将 errbacks 添加到 Deferreds after put 来延迟'消息 它们在 DeferredList 中,因为 DeferredList 不会吞下错误。 (虽然更方便的方法是简单地设置 消费错误标志)
def __init__(self, deferredList, fireOnOneCallback=0, fireOnOneErrback=0, consumeErrors=0): (source)
overrides twisted.internet.defer.Deferred.__init__
Initialize a DeferredList.
Parameters deferredList The list of deferreds to track. (type: list of Deferreds )
fireOnOneCallback (keyword param) a flag indicating that only one callback needs to be fired for me to call my callback
fireOnOneErrback (keyword param) a flag indicating that only one errback needs to be fired for me to call my errback
consumeErrors (keyword param) a flag indicating that any errors raised in the original deferreds should be consumed by this DeferredList. This is useful to prevent spurious warnings being logged.
具体来说:
fireOnOneCallback(关键字参数)一个标志,表明只有一个 需要触发回调才能调用我的回调
我正在寻找像fireOnOneCallback=True 这样的行为,而是在n 回调上触发。我试过这样做,但它已经变成了一团糟。我相信有更好的方法。
def _get_fired_index(deferred_list):
for index, (success, value) in enumerate(deferred_list):
if success:
return index
raise ValueError('No deferreds were fired.')
def _fire_on_other_callback(already_fired_index, deferred_list, callback, ):
dlist_except_first_fired = (
deferred_list[:already_fired_index]
+ deferred_list[already_fired_index + 1:]
)
dlist2 = DeferredList(dlist_except_first_fired, fireOnOneCallback=True)
dlist2.addCallback(callback, deferred_list)
def _fire_on_two_callbacks(deferreds, callback, errback):
dlist1 = DeferredList(deferreds, fireOnOneCallback=True)
dlist1.addCallback(_get_fired_index)
dlist1.addCallback(_fire_on_other_callback, deferreds, callback, errback)
【问题讨论】: