Twisted: как DeferredList связан с блокировкой повторного запуска процедуры, работающей по таймеру?
Имею дело с legacy-кодом на Twisted, в котором есть интересный комментарий, что возврат из функции объекта DeferredList служит блокировке повторного запуска функции, работающей по таймеру, до завершения работы всех deferred, входящих в этот список.
Структура кода примерно такая. Есть метод класса, который запускается по таймеру:
from twisted.internet.defer import DeferredQueue, CancelledError, DeferredList
from twisted.internet import task
class AnyObserver(IObserver):
def __init__(self, server, interval, timeout):
self.server = server
self.timeout = timeout
# инициализация разных sql-запросов
task.LoopingCall(self.iterate).start(interval, False)
def iterate (self, ...):
d = self.server.db.runQuery(self.select_command_sql)
d.addCallback(self.check_rows)
# ...
def check_rows(self, rows, ...):
from twisted.internet import reactor
defer_list = []
# тут сложная логика обработки строк из rows в цикле и добавление в defer_list (создаваемых в процессе) объектов deferred с навешанными callback и errback
return DeferredList(defer_list) # чтобы следующая итерация не началась раньше окончания этой
Версия twisted 12.2.0.
В документации лишь основное назначение и неясно, где и за счет чего происходит синхронизирующее ожидание.
Прошу помочь разобраться с принципами работы и практиками применения DeferredList.