Temporizador de no sondeo / no locking?

La mejor solución que he encontrado hasta ahora es simplemente usar la función sleep() . Me gustaría ejecutar mi propia función de callback cuando ocurra el evento del vencimiento del temporizador. ¿Hay alguna manera de actuar basada en eventos?

 from time import sleep # Sleep for a minute time.sleep(60) 

Hay una solución simple incorporada, utilizando el módulo de subprocesamiento :

 import threading timer = threading.Timer(60.0, callback) timer.start() # after 60 seconds, 'callback' will be called ## (in the meanwhile you can do other stuff...) 

También puedes pasar args y kwargs a tu callback. Ver aqui

Creo que podría ser muy simple. Echale un vistazo a éste ejemplo. ¡Funciona incluso en una consola python!

 from threading import Thread from time import sleep # Function to be called when the timer expires def myFunction(): print 'Did anyone call me?' # Function with the timer def myTimer(seconds): sleep(seconds) myFunction() # Thread that will sleep in background and call your function # when the timer expires. myThread = Thread(target=myTimer, args=(4,)) myThread.start() 

Ponga la cantidad de segundos que desee y siga trabajando con la consola o ejecutando el hilo / progtwig principal. Notará que se llamará a la función cuando el temporizador llegue a su fin.

Editar

Otro buen ejemplo, considerando el comentario de @tarabyte es aquel en el que se llama a la función solo en función del valor de alguna variable o marca. Espero que esta sea la respuesta que @tarabyte está buscando.

 from threading import Thread from time import sleep myFlag = False # Function to be called when the flag turns on def myFunction(): print 'Did anyone call me?' def myTimer(): global myFlag while True: if myFlag: myFunction() myFlag = False else: sleep(1) # Thread that will sleep in background and call your function # when the myFlag turns to be True myThread = Thread(target=myTimer) myThread.start() # Then, you can do whatever you want and later change the value of myFlag. # Take a look at the output inside ipython when the value of myFlag is changed. In [35]: myFlag Out[35]: False In [36]: myFlag = True In [37]: Did anyone call me? 

A veces, una solución simple es la mejor, incluso si sondea el tiempo. He usado esto con gran éxito antes, no se bloquea si tu hilo no se detiene en él.

Creo que manejaría esto de la manera más simple al verificar los tiempos, ya que esto es mucho más simple y económico en términos de recursos que la elaboración de una solución de hilos separados:

 def event_minute_later(event): print(time.time()) # use for testing, comment out or delete for production return event + 60 < time.time() 

Y uso:

 >>> event = time.time() >>> print(event) 1393962502.62 >>> event_minute_later(event) 1393962526.73 False >>> event_minute_later(event) 1393962562.9 True