使用deferred进行无限调用循环

Thi*_*ien 3 twisted deferred

我们可以使用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()
Run Code Online (Sandbox Code Playgroud)

Jea*_*one 5

这对Deferreds来说不是一个好用的.相反,尝试使用reactor.callLater:

from twisted.internet import reactor

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

loopPrinting()
reactor.run()
Run Code Online (Sandbox Code Playgroud)

或者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()
Run Code Online (Sandbox Code Playgroud)

您的基于延迟的版本有几个问题.首先,它定义了Deferred上的回调,返回相同的Deferred.a从另一个Deferred(让我们调用它)的回调中返回Deferred(让我们调用它b)会做一些叫做"链接"的事情.它会b暂停其回调链,直到a产生结果.在其中a并且b实际上是相同的延迟实例的情况下,这几乎没有意义.

其次,当向已经有结果的Deferred添加回调时,将立即调用回调.在您的情况下,您的回调会添加另一个回调.而该回调又增加了一个回调.所以你的行中包含了一个无限循环d.addCallback(loopPrinting).这将阻止反应堆运行,破坏程序的任何其他部分.