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.


Ответы (0 шт):