Ejecutar cierto código cada n segundos

¿Hay una manera de, por ejemplo, imprimir Hello World! cada n segundos? Por ejemplo, el progtwig pasaría por cualquier código que tuviera, luego, una vez que hubieran transcurrido 5 segundos (con time.sleep() ) ejecutaría ese código. Sin embargo, estaría usando esto para actualizar un archivo, no para imprimir Hello World.

Por ejemplo:

 startrepeat("print('Hello World')", .01) # Repeats print('Hello World') ever .01 seconds for i in range(5): print(i) >> Hello World! >> 0 >> 1 >> 2 >> Hello World! >> 3 >> Hello World! >> 4 

 import threading def printit(): threading.Timer(5.0, printit).start() print "Hello, World!" printit() # continue with the rest of your code 

Mi humilde punto de vista sobre el tema, una generalización de la respuesta de Alex Martelli, con el control de inicio () y detención ():

 from threading import Timer class RepeatedTimer(object): def __init__(self, interval, function, *args, **kwargs): self._timer = None self.interval = interval self.function = function self.args = args self.kwargs = kwargs self.is_running = False self.start() def _run(self): self.is_running = False self.start() self.function(*self.args, **self.kwargs) def start(self): if not self.is_running: self._timer = Timer(self.interval, self._run) self._timer.start() self.is_running = True def stop(self): self._timer.cancel() self.is_running = False 

Uso:

 from time import sleep def hello(name): print "Hello %s!" % name print "starting..." rt = RepeatedTimer(1, hello, "World") # it auto-starts, no need of rt.start() try: sleep(5) # your long-running job goes here... finally: rt.stop() # better in a try/finally block to make sure the program ends! 

caracteristicas:

  • Solo biblioteca estándar, sin dependencias externas
  • start() y stop() son seguros para llamar varias veces, incluso si el temporizador ya se ha iniciado / detenido
  • La función a llamar puede tener argumentos posicionales y nombrados.
  • Puede cambiar el interval cualquier momento, será efectivo después de la próxima ejecución. ¡Lo mismo para args , kwargs e incluso la function !

Guárdese un episodio esquizofrénico y use el progtwigdor avanzado de Python: http://pythonhosted.org/APScheduler

El código es tan simple:

 from apscheduler.scheduler import Scheduler sched = Scheduler() sched.start() def some_job(): print "Every 10 seconds" sched.add_interval_job(some_job, seconds = 10) .... sched.shutdown() 
 def update(): import time while True: print 'Hello World!' time.sleep(5) 

Eso funcionará como una función. El while True: hace correr para siempre. Siempre puede sacarlo de la función si lo necesita.

Aquí hay un ejemplo simple compatible con APScheduler 3.00+ :

 # note that there are many other schedulers available from apscheduler.schedulers.background import BackgroundScheduler sched = BackgroundScheduler() def some_job(): print('Every 10 seconds') # seconds can be replaced with minutes, hours, or days sched.add_job(some_job, 'interval', seconds=10) sched.start() ... sched.shutdown() 

Alternativamente, puede utilizar lo siguiente. A diferencia de muchas de las alternativas, este temporizador ejecutará el código deseado cada n segundos exactamente (independientemente del tiempo que demore el código en ejecutarse). Así que esta es una gran opción si no puedes permitirte un cambio.

 import time from threading import Event, Thread class RepeatedTimer: """Repeat `function` every `interval` seconds.""" def __init__(self, interval, function, *args, **kwargs): self.interval = interval self.function = function self.args = args self.kwargs = kwargs self.start = time.time() self.event = Event() self.thread = Thread(target=self._target) self.thread.start() def _target(self): while not self.event.wait(self._time): self.function(*self.args, **self.kwargs) @property def _time(self): return self.interval - ((time.time() - self.start) % self.interval) def stop(self): self.event.set() self.thread.join() # start timer timer = RepeatedTimer(10, print, 'Hello world') # stop timer timer.stop() 

Aquí hay una versión que no crea un nuevo hilo cada n segundos:

 from threading import Event, Thread def call_repeatedly(interval, func, *args): stopped = Event() def loop(): while not stopped.wait(interval): # the first call is in `interval` secs func(*args) Thread(target=loop).start() return stopped.set 

El evento se utiliza para detener las repeticiones:

 cancel_future_calls = call_repeatedly(5, print, "Hello, World") # do something else here... cancel_future_calls() # stop future calls 

Ver Mejorar la implementación actual de un setInterval python

Puede iniciar un hilo separado cuyo único deber es contar durante 5 segundos, actualizar el archivo, repetir. No querrías que este hilo separado interfiera con tu hilo principal.