3

我们可以使用延迟(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()
4

1 回答 1

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()

或者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 上定义了一个回调,该回调返回相同的 Deferreda从另一个 Deferred(我们称之为它)的回调中返回一个 Deferred(我们称之为它b)会做一些称为“链接”的事情。它b暂停其回调链,直到a有结果。在 whereab实际上是同一个 Deferred 实例的情况下,这几乎没有意义。

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

于 2010-08-02T21:00:03.650 回答