2013-02-14 19 views
23

Mam problem, gdy używam apscheduler w mojej aplikacji kolby.apscheduler w Flask wykonuje dwa razy

W moim view.py pliku piszę jak ten

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

I to metoda ta test_scheduler() jest wykonywana dwa razy w każdym pięć sekund

TEST +1360844314,01 TEST 1360844314,2

+0

Proszę spojrzeć tutaj, miał ten sam problem w Django. http://stackoverflow.com/a/27303834/573034 – Paolo

Odpowiedz

0

Zrobiłem to, dodałem parametr add_interval_job, aby rozpocząć po pewnym punkcie czasowym

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

najlepszym rozwiązaniem jest użycie add_cron_job('*') zamiast add_interval_job('*')

25

W trybie debugowania Reloader FlasK będzie załadowania aplikacji kolbę dwukrotnie (How to stop Flask from initialising twice in Debug Mode?). Nie jestem pewien, dlaczego tak jest, ale powoduje to, że zadania apschedulera są planowane dwukrotnie. Szybki print "loaded scheduler" tuż przed sched.start() potwierdza to.

Istnieje kilka sposobów obejścia tego, jak wspomniano w połączonej odpowiedzi. Ten, stwierdziliśmy, że pracował najlepiej jest po prostu wyłączyć Reloader tak:

app.run(use_reloader=False) 

Oznacza to muszę odświeżyć moją aplikację ręcznie jak go rozwijać, ale to niewielka cena zapłacić, aby uzyskać apscheduler pracy.

+1

Doskonała, tylko odpowiedź, której potrzebowałam od Google. PO powinien zaakceptować. – DeaconDesperado

+0

Ta odpowiedź również zadziałała i jest właściwą odpowiedzią. Czy możesz to zaakceptować? – stuxnetting

13

Podczas korzystania z reloadera istnieją procesy nadrzędne i podrzędne. Twój wątek harmonogramu działa w obu. Trzeba zapobiegać planującego przed uruchomieniem procesu nadrzędnego

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

Tak, to pomaga. Wypróbowałem wiele opcji, w tym plik flokowany bez powodzenia. –

5

można uruchomić program planujący w kolbie za before_first_request() dekoratora, który „rejestruje funkcję do uruchomienia przed pierwszym wnioskiem do tej instancji aplikacji” .

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

Należy pamiętać, że before_first_request() będzie zawsze wywoływany ponownie z pierwszym żądaniem po ponownym załadowaniu serwera.