Twisted: отложить, что запускает неоднократно? - PullRequest
5 голосов
/ 18 августа 2010

Deferred s - отличный способ выполнить асинхронную обработку в Twisted. Однако они, как следует из названия, предназначены для отложенных вычислений, которые запускаются и завершаются только один раз, вызывая обратные вызовы один раз. Что делать, если у меня есть повторное вычисление, как нажатие кнопки? Есть ли какой-либо Deferred -подобный объект, который может запускаться многократно, вызывая все обратные вызовы, прикрепленные к нему, когда он запускается?

Ответы [ 2 ]

3 голосов
/ 19 августа 2010

Я настроил это сейчас.Для моего ограниченного случая использования он делает то, что я хочу.

class RepeatedDeferred:
    def __init__(self):
        self.callbacks = []

        self.df = defer.Deferred()

    def addCallback(self, callback):
        self.callbacks.append(callback)

        self.df.addCallback(callback)

    def callback(self, res):
        self.df.callback(res)

        self.df = defer.Deferred()
        for c in self.callbacks:
            self.df.addCallback(c)

Кто-то, дайте мне знать, если это ужасно.

0 голосов
/ 19 августа 2010

То, что вы можете искать, это defer.inlineCallbacks, который позволяет использовать генератор для создания последовательной цепочки отложенных элементов. По сути, вы могли бы просто создать генератор, который никогда не заканчивается (или не заканчивается условно) и продолжать генерировать отсроченные из этого.

Существует большая рецензия на использование inlineCallbacks на krondo.com .

...