usar thread funcion delays como python

thread - time.sleep python 3



romper/interrumpir un time.sleep() en python (6)

Imaginé que lanzaría esto.

import time def sleep(seconds): for i in range(seconds): try: time.sleep(1) except KeyboardInterrupt: continue sleep(60)

Necesito romper con time.sleep () usando ctrl c.

While 1: time.sleep(60)

En el código anterior, cuando el control ingresa a la función time.sleep, debe transcurrir un total de 60 segundos para que python maneje la CTRL C

¿Hay alguna manera elegante de hacerlo? de modo que puedo interrumpir incluso cuando el control está en la función time.sleep

editar

Lo estaba probando en una implementación heredada que usa python 2.2 en Windows 2000 que causó todos los problemas. Si hubiera usado una versión más alta de Python CTRL C habría interrumpido el sueño (). Hice un hack rápido llamando a sleep (1) dentro de un ciclo for. que solucionó temporalmente mi problema


La excepción KeyboardInterrupt se produce cuando un usuario pulsa la tecla de interrupción, Ctrl-C. En python esto se traduce de una señal SIGINT. Eso significa que puedes manejarlo como quieras usando el módulo de señal:

import signal def handler(signum, frame): print "do whatever, like call thread.interrupt_main()" signal.signal(signal.SIGINT, handler) while 1: time.sleep(forever)

De esta forma, puedes hacer lo que quieras al recibir una interrupción del teclado.


La respuesta correcta es usar threading.Event stdlib''s threading.Event

Seguro que puedes ajustar tu intervalo de sueño para que duermas por períodos muy cortos, pero ¿y si realmente quieres ejecutar tu ciclo una vez cada 60? Luego necesita hacer más trabajo para determinar si es hora de correr o simplemente seguir durmiendo. Además, todavía estás bloqueando técnicamente, pero solo por un corto período de tiempo. Contraste al threading.Event . threading.Event :

#!/usr/bin/env python2.7 from threading import Event exit = Event() def main(): while not exit.is_set(): do_my_thing() exit.wait(60) print("All done!") # perform any cleanup here def quit(signo, _frame): print("Interrupted by %d, shutting down" % signo) exit.set() if __name__ == ''__main__'': import signal for sig in (''TERM'', ''HUP'', ''INT''): signal.signal(getattr(signal, ''SIG''+sig), quit); main()

Cuando el manejador de señales llama a exit.set() , la llamada exit.set() del hilo principal se interrumpirá inmediatamente .

Ahora, podría usar un Event para indicar que hay más trabajo por hacer, etc. Pero en este caso tiene una doble función como indicador conveniente de que queremos abandonar (por ejemplo, la parte while not exit.is_set() ).

También tiene la opción de poner cualquier código de limpieza después de su ciclo while.


La solución más elegante es, sin duda, threading.Event . threading.Event , aunque si solo necesitas un hack rápido, este código funciona bien:

import time def main(): print("It’s time !") if __name__ == "__main__": print("press ctrl-c to stop") loop_forever = True while loop_forever: main() try: time.sleep(60) except KeyboardInterrupt: loop_forever = False


No estoy seguro de cuál es el sentido de este código, pero si es necesario, use un intervalo de inactividad más corto () y póngalo en un bucle:

for i in range(60): sleep(1)

Captura de la excepción KeyboardInterrupt con try..except es sencillo


Probé tu código con las versiones de Python 2.5, 2.6, 3 bajo Linux y todas arrojaron la excepción "KeyboardInterrupt" al presionar CTRL-C.

Tal vez algún manejo de excepciones capte la interrupción o su problema es así: ¿Por qué KeyboardInterrupt no funciona en python?