Используйте deferred для создания бесконечного цикла вызова - PullRequest
3 голосов
/ 02 августа 2010

Можем ли мы использовать deferred (http://twistedmatrix.com/documents/current/core/howto/defer.html) для создания бесконечного цикла вызова, в котором функция добавляет себя в цепочку отложенного вызова? Я пытался сделать это, но это не работает:

d = deferred.Deferred()
first = True

def loopPrinting(dump):
  ch = chr(random.randint(97, 122))
  print ch
  global d, first
  d.addCallback(loopPrinting)
  if first:
    d.callback('a')
    first = False
  return d

loopPrinting('a')

reactor.run()

1 Ответ

5 голосов
/ 03 августа 2010

Это не очень хорошее применение для Отложенных.Вместо этого попробуйте использовать reactor.callLater:

from twisted.internet import reactor

def loopPrinting():
    print chr(random.randint(97, 122))
    reactor.callLater(1.0, loopPrinting)

loopPrinting()
reactor.run()

или twisted.internet.task.LoopingCall:

from twisted.internet import task, reactor

def loopPrinting():
    print chr(random.randint(97, 122))

loop = task.LoopingCall(loopPrinting)
loop.start(1.0)
reactor.run()

В вашей версии с задержкой возникла пара проблем.Во-первых, он определяет обратный вызов для Deferred, который возвращает то же самое Deferred .Возврат Deferred (назовем его a) из обратного вызова на другой Deferred (назовем его b) делает нечто, называемое «цепочкой».b приостанавливает цепочку обратного вызова, пока a не даст результат.В случае, когда a и b фактически являются одним и тем же отложенным экземпляром, это не имеет большого смысла или вообще не имеет смысла.

Во-вторых, при добавлении обратного вызова к отложенному, который уже имеет результат, обратный вызовпозвонил немедленно.В вашем случае ваш обратный вызов добавляет еще один обратный вызов.И этот обратный вызов добавляет еще один обратный вызов.Таким образом, у вас есть бесконечный цикл, содержащийся внутри вашей строки d.addCallback(loopPrinting).Это предотвратит работу реактора, нарушив любую другую часть вашей программы.

...