A twisted.internet.defer.DeferredList
делает это:
Я объединяю группу отложений в один обратный вызов.
Я отслеживаю список отложенных для их обратных вызовови сделайте один обратный вызов, когда все они завершены, список (успех, результат) кортежей, «успех» - логическое значение.
Обратите внимание, что вы все равно можете использовать Deferred после помещения его в DeferredList.Например, вы можете подавить сообщения «Необработанная ошибка в отложенных», добавив ошибки в Deferreds после , поместив их в DeferredList, так как DeferredList не поглотит ошибки.(Хотя более удобный способ сделать это - просто установить флаг потреблениеErrors)
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
(ключевое слово param) флаг, указывающийчто для вызова моего обратного вызова
мне нужен только один обратный вызов. Я ищу поведение, подобное 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)