使用延迟创建一个无限呼叫循环
问题描述:
我们可以使用延迟(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()
答
这不适用于延迟。相反,尝试使用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(我们称之为b
)的回调中返回Deferred(让我们称之为a
)做一些称为“链接”的事情。它使b
暂停它的回调链,直到a
有结果。在a
和b
实际上是相同的延迟实例的情况下,这很少或没有意义。
其次,在向已有结果的Deferred添加回调时,将立即调用回调。在你的情况下,你的回调添加了另一个回调。并且该回调添加了另一个回调。所以你有一个无限循环全部包含在你的d.addCallback(loopPrinting)
行内。这将阻止反应堆运行,破坏程序的任何其他部分。
我想避免callLater在我的代码或其他基于时间的方法。我试图做一个函数链,其中一个将在前一个完成后执行,所以链的运行将独立于时间。有没有办法做到这一点?对于[f1,f2,f3]中的f, – Thien 2010-08-02 21:51:49
):f() – 2010-08-03 12:16:42