¿Cómo usar LoopingCall con hilos?

Tengo un ejemplo simple:

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

su guión no funciona correctamente. Yo quiero:

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

preguntado el 27 de agosto de 11 a las 23:08

1 Respuestas

LoopingCall ejecutará el invocable que le pase cada N segundos, donde N es el número que pasa para comenzar. No espera N segundos después de que finaliza la llamada anterior, espera N segundos después de que comenzó la llamada anterior. En otras palabras, intenta permanecer en el intervalo definido por N y la hora de inicio, ejecutando una llamada en N segundos, N * 2 segundos, N * 3 segundos, etc.

Si el proceso está demasiado ocupado para realizar una de las llamadas, omitirá esa iteración. Si la llamada devuelve un diferido y el diferido no se ha disparado en el siguiente intervalo, omitirá esa iteración.

Entonces, puede acercarse a su comportamiento deseado regresando d al final de loop, pero LoopingCall no siempre va a esperar 2 segundos después de los incendios diferidos. Esperará el siguiente múltiplo de N segundos, contando desde la hora de inicio, y luego volverá a llamar a la función.

Respondido 28 ago 11, 04:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.