Это не очень хорошее применение для Отложенных.Вместо этого попробуйте использовать 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)
.Это предотвратит работу реактора, нарушив любую другую часть вашей программы.