我们可以使用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)
这对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).这将阻止反应堆运行,破坏程序的任何其他部分.
| 归档时间: |
|
| 查看次数: |
2761 次 |
| 最近记录: |