python - apscheduler en Flask ejecuta dos veces
(5)
Esta pregunta ya tiene una respuesta aquí:
Tengo un problema cuando estoy usando apscheduler en mi aplicación matraz.
En mi archivo view.py, escribo así
import time
from apscheduler.scheduler import Scheduler
def test_scheduler():
print "TEST"
print time.time()
sched = Scheduler()
sched.add_interval_job(test_scheduler, seconds=5)
sched.start()
Y luego este método test_scheduler () se ejecuta dos veces en cada cinco segundos
PRUEBA 1360844314.01 PRUEBA 1360844314.2
Al usar el recargador, están los procesos maestro e hijo. El hilo del planificador se ejecuta en ambos. Debe evitar que el planificador se ejecute en el proceso maestro
if not app.debug or os.environ.get(''WERKZEUG_RUN_MAIN'') == ''true'':
sched = Scheduler()
sched.add_interval_job(test_scheduler, seconds=5)
sched.start()
En el modo de depuración, el recargador de Flask cargará la aplicación del matraz dos veces ( ¿Cómo evitar que Flask se inicialice dos veces en el Modo de depuración? ). No estoy seguro de por qué esto es así, pero hace que los trabajos del apscheduler se programen dos veces. Un print "loaded scheduler"
rápida justo antes de sched.start()
confirma.
Hay un par de formas de evitar esto, como se menciona en la respuesta vinculada. El que encontré que funcionó mejor es simplemente deshabilitar el recargador de la siguiente manera:
app.run(use_reloader=False)
Esto significa que tengo que volver a cargar mi aplicación manualmente a medida que la desarrolle, pero es un pequeño precio a pagar para que funcione el apscheduler.
Lo hice, agregué en el parámetro add_interval_job para comenzar después de un cierto punto de tiempo
sched.add_interval_job(test_scheduler, seconds=5, start_date=''2013-02-13 00:00'')
Puede iniciar el programador en el decorador before_first_request() Flask, que " registra una función que se ejecutará antes de la primera solicitud a esta instancia de la aplicación ".
import time
import atexit
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.triggers.interval import IntervalTrigger
@app.before_first_request
def initialize():
scheduler = BackgroundScheduler()
scheduler.start()
scheduler.add_job(
func=print_date_time,
trigger=IntervalTrigger(seconds=5),
id=''printing_job'',
name=''Print date and time every five seconds'',
replace_existing=True)
# Shut down the scheduler when exiting the app
atexit.register(lambda: scheduler.shutdown())
def print_date_time():
print time.strftime("%A, %d. %B %Y %I:%M:%S %p")
Tenga en cuenta que before_first_request()
siempre se volverá a llamar con la primera solicitud después de volver a cargar el servidor.
la mejor solución es usar add_cron_job(''*'')
lugar de add_interval_job(''*'')