2011-08-27 2 views
3

J'ai un exemple simple:Comment utiliser LoopingCall avec des threads?

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

son script pas un travail correct. Je veux:

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

Répondre

5

LoopingCall courra le appelable vous passez à chaque seconde N, où N est le numéro que vous passez à commencer. Il n'attend pas N secondes après la fin de l'appel précédent, il attend N secondes après le début de l'appel précédent. En d'autres termes, il essaie de rester sur l'intervalle défini par N et l'heure de début, en exécutant un appel à N secondes, N * 2 secondes, N * 3 secondes, etc.

Si le processus est trop occupé pour cela pour faire l'un des appels, il ignorera cette itération. Si l'appel renvoie un différé et que le différé n'a pas été déclenché par l'intervalle suivant, il ignore cette itération.

Ainsi, vous pouvez vous rapprocher de votre comportement souhaité en retournant d à la fin de loop, mais LoopingCall ne va pas toujours attendre 2 secondes après le déclenchement différé. Il attendra le prochain multiple de N secondes, en comptant à partir de l'heure de début, puis appellera à nouveau la fonction.