使用延迟创建一个无限呼叫循环

问题描述:

我们可以使用延迟(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有结果。在ab实际上是相同的延迟实例的情况下,这很少或没有意义。

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

+0

我想避免callLater在我的代码或其他基于时间的方法。我试图做一个函数链,其中一个将在前一个完成后执行,所以链的运行将独立于时间。有没有办法做到这一点?对于[f1,f2,f3]中的f, – Thien 2010-08-02 21:51:49

+1

):f() – 2010-08-03 12:16:42