2013-02-14 22 views
23

Ho un problema quando sto usando apscheduler nella mia applicazione di flask.apscheduler in Flask esegue due volte

Nel mio file view.py sto scrivendo in questo modo

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() 

E poi questo metodo test_scheduler() esegue due volte in ogni cinque secondi

TEST 1360844314,01 TEST 1360844314,2

+0

Si prega di dare un'occhiata qui, ha avuto lo stesso problema in Django. http://stackoverflow.com/a/27303834/573034 – Paolo

risposta

0

Ce l'ho fatta, ho aggiunto il parametro add_interval_job per iniziare dopo un certo periodo di tempo

sched.add_interval_job(test_scheduler, seconds=5, start_date='2013-02-13 00:00') 
-1

la migliore soluzione è quella di utilizzare add_cron_job('*') invece di add_interval_job('*')

25

In modalità di debug, ricaricatore di Flask caricherà l'applicazione pallone due volte (How to stop Flask from initialising twice in Debug Mode?). Non sono sicuro del perché questo sia, ma fa sì che i lavori di apscheduler vengano pianificati due volte. Un rapido print "loaded scheduler" subito prima del sched.start() conferma questo.

Ci sono alcuni modi per aggirare questo problema, come menzionato nella risposta collegata. Quello che ho trovato che ha funzionato meglio è solo per disabilitare il ricaricatore in questo modo:

app.run(use_reloader=False) 

Significa che devo ricaricare la mia app manualmente come io sviluppo di esso, ma è un piccolo prezzo da pagare per ottenere apscheduler lavoro.

+1

Eccellente, solo la risposta che avevo bisogno in arrivo da Google. OP dovrebbe accettare. – DeaconDesperado

+0

Questa risposta ha funzionato anche per me ed è la risposta giusta in effetti. La prego di accettare questo? – stuxnetting

13

Quando si utilizza il reloader, ci sono i processi master e figlio. Il thread del programma di pianificazione viene eseguito in entrambi. È necessario evitare che l'utilità di pianificazione esecuzione nel processo 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() 
+0

Sì, questo aiuta. Ho provato molte opzioni, incluso il file floccato senza successo. –

5

È possibile avviare il programma di pianificazione in before_first_request() decoratore di Flask, che "registra una funzione da eseguire prima della prima richiesta a questa istanza dell'applicazione" .

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") 

noti che before_first_request() sarà sempre chiamato di nuovo con la prima richiesta dopo ricaricamento del server.