2010-08-08 8 views
26

Quiero saber cómo llamar a una función después de un tiempo determinado. He intentado time.sleep() pero esto detiene todo el script. Quiero que la secuencia de comandos continúe, pero después de "segundos" llamar a una función y ejecutar la otra secuencia de comandos al mismo tiempoPython Time Delays

Respuesta

47

Eche un vistazo a threading.Timer. Ejecuta tu función en un nuevo hilo.

from threading import Timer 

def hello(): 
    print "hello, world" 

t = Timer(30.0, hello) 
t.start() # after 30 seconds, "hello, world" will be printed 
+0

multithreading ... hmm, suena familiar. ¿No es que había más de un proceso? Bueno, de todos modos, eso se ve bien. si utilizo t.start() más de una vez, ¿continúa, me da un error o reinicia el temporizador? – drnessie

+0

@drnessie: "¿No es que había más de un proceso?" No, es cuando tienes más de un hilo. "si uso t.start() más de una vez, ¿continúa, me da un error o reinicia el temporizador?" - Obtiene un error 'RuntimeError: thread already started' que puede verificar fácilmente duplicando la última línea del código fuente anterior y ejecutándolo. –

+0

¿Hay alguna forma de deshacerse del error, además de detener y luego reiniciar el temporizador? – drnessie

3

Si desea una función a ser llamada después de un tiempo y no para detener la secuencia de comandos que está inherentemente trata de código de roscado. Si desea establecer una función para llamar y no preocuparse por ella, debe utilizar explícitamente multi-threading, como el answr de Mark Byers, o utilizar un marco de codificación que tenga un bucle principal que se encargue del despacho de funciones para usted - como twisted, qt, gtk, pyglet, y tantos otros. Cualquiera de estos requerirá que reescribas tu código para que funcione desde el bucle principal de ese marco.

O bien, o escribiendo un bucle principal desde el evento que se verifica en su código - En general, si lo único que desea son llamadas de función única, threading.Timer es la manera de hacerlo. Si desea utilizar estas llamadas programadas para buclear realmente el programa como se hace generalmente con setTimeout de javascript, es mejor que seleccione uno de los marcos de codificación que enumeré arriba y refactorice su código para aprovecharlo.

+0

Este código no funciona threading.Timer (30.0, self.timestart (ventana)) .start() Se llama self.timestart, dando a la ventana arg, pero lo está haciendo Inmediatamente, no después de 30 seg Would Le pregunté a Mark, pero ya le he molestado lo suficiente, y tú también sabes lo que estás hablando :) – drnessie

-4
import threading 

def time_demo(): 
    threading.Timer(5.0, time_demo()).start() 

print 'Hello this is time demo function' 
time_demo() 
+1

Tu código se bloquea porque tienes una recursividad infinita, necesitas quitar los paréntesis cuando pasas en time_demo porque debería estar pasando en un puntero de función. – cujo