2011-08-27 22 views
3

我有一個簡單的例子:如何在線程中使用LoopingCall?

from twisted.internet import utils, reactor 
from twisted.internet import defer 
from twisted.internet import threads 
from twisted.internet.task import LoopingCall,deferLater 
import time 

def test1(): 
    print 'test' 

def test2(res): 
     l = [] 
     for i in xrange(3): 
      l.append(threads.deferToThread(test4)) 
     return defer.DeferredList(l) 

def test3(res): 
    pass 

def test4(): 
    print 'thread start' 
    time.sleep(10) 
    print 'thread stop' 


def loop(): 
    d = defer.maybeDeferred(test1) 
    d = d.addCallback(test2) 
    d.addCallback(test3) 

LoopingCall(loop).start(2) 

reactor.run() 

它的腳本不正確的工作。我想:

1) print 'test' 
2) start 3 threads, waiting while all threads stops 
3) sleep 2 seconds 
4) repeat 

回答

5

LoopingCall將運行傳遞到它的每N秒可調用的,其中N是你傳遞給啓動次數。在上一次呼叫結束後,它不會等待N秒,而是在上次呼叫開始後等待N秒。換句話說,它試圖停留在由N和起始時間定義的間隔上,以N秒,N * 2秒,N * 3秒等等運行呼叫。

如果進程太忙做出其中一個呼叫,它將跳過該迭代。如果調用返回Deferred並且Deferred在下一個時間間隔內未觸發,則它將跳過該迭代。

所以,你可以通過在loop結束返回d接近你想要的行爲,但LoopingCall不會總是等待2秒延遲閃光後。它將等待N秒的下一個倍數,從開始時間開始計數,然後再次調用該函數。