Ejecute cierto código cada n segundos [duplicado]

Resuelto John Howard asked hace 14 años • 7 respuestas

¿Hay alguna manera de, por ejemplo, imprimir Hello World!cada n segundos? Por ejemplo, el programa revisaría cualquier código que tuviera y luego, una vez transcurridos 5 segundos (con time.sleep()), ejecutaría ese código. Sin embargo, usaría esto para actualizar un archivo, no para imprimir Hola Mundo.

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
John Howard avatar Aug 03 '10 11:08 John Howard
Aceptado
import threading

def printit():
  threading.Timer(5.0, printit).start()
  print "Hello, World!"

printit()

# continue with the rest of your code

https://docs.python.org/3/library/threading.html#timer-objects

Alex Martelli avatar Aug 03 '2010 05:08 Alex Martelli

Mi humilde opinión sobre el tema, una generalización de la respuesta de Alex Martelli, con control start() y stop():

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!

Características:

  • Solo biblioteca estándar, sin dependencias externas
  • start()y stop()es seguro llamar varias veces incluso si el cronómetro ya se ha iniciado o detenido
  • La función a llamar puede tener argumentos posicionales y con nombre.
  • Puede cambiar intervalen cualquier momento, será efectivo después de la próxima ejecución. ¡ Lo mismo para argse kwargsincluso function!
MestreLion avatar Oct 31 '2012 04:10 MestreLion

Ahórrate un episodio esquizofrénico y utiliza el programador avanzado de Python :

El código es así de 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()
Yan King Yin avatar Jul 05 '2013 15:07 Yan King Yin
def update():
    import time
    while True:
        print 'Hello World!'
        time.sleep(5)

Eso se ejecutará como una función. Esto lo while True:hace funcionar para siempre. Siempre puedes sacarlo de la función si lo necesitas.

avacariu avatar Aug 03 '2010 04:08 avacariu