Ejecute cierto código cada n segundos [duplicado]
¿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
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
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()
ystop()
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
interval
en cualquier momento, será efectivo después de la próxima ejecución. ¡ Lo mismo paraargs
ekwargs
inclusofunction
!
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()
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.