2013-02-14 44 views
23

Şişem uygulamada apscheduler kullanırken sorun yaşıyorum.apscheduler iki kez çalıştırıyor

benim view.py dosyasında i her beş saniye

TEST 1360844314,01 TEST iki kez) bu

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

Ve sonra bu yöntem test_scheduler (gibi yürütür yazıyorum 1360844314,2

+0

Lütfen buraya bir göz atın, Django'da aynı sorunu yaşayın. http://stackoverflow.com/a/27303834/573034 – Paolo

cevap

0

Ben yaptım, belirli bir zaman noktası

sonra başlatmak için add_interval_job parametresinde ekledim 210
sched.add_interval_job(test_scheduler, seconds=5, start_date='2013-02-13 00:00') 
-1

iyi çözüm ayıklama modunda yerine add_interval_job('*')

25

ait add_cron_job('*') kullanmaktır, şişeyi en Reloader iki kez (How to stop Flask from initialising twice in Debug Mode?) Şişe uygulamasını yükleyecektir. Bunun neden olduğundan emin değilim, ama apscheduler'ın işlerinin iki kez planlanmasına neden oluyor. sched.start()'dan hemen önce bir hızlı print "loaded scheduler" bunu doğrular. Bağlantılı cevapta belirtildiği gibi, bunun etrafında birkaç yol vardır. Bunu bulan en iyi şöyle Reloader devre dışı bırakmak için adildir çalıştı: Ben bunu geliştirmek el olarak benim app tekrar yüklemek zorunda gelir, ancak apscheduler çalışma almak için ödemek için küçük bir bedel

app.run(use_reloader=False) 

.

+1

Mükemmel, sadece Google'dan gelen ihtiyacım olan cevap. OP kabul etmeli. – DeaconDesperado

+0

Bu cevap benim için de çalıştı ve doğru cevap aslında. Bunu kabul eder misiniz lütfen? – stuxnetting

13

Yükleyiciyi kullanırken ana ve alt işlemler vardır. Zamanlayıcı iş parçacığı her ikisinde de çalışır. Sen "uygulamanın bu örneğine ilk istek önce çalıştırılacak bir işlevini kaydeder"

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

Evet, bu yardımcı olur. Akınlanmamış dosya da dahil olmak üzere bir çok seçeneği denedim. –

5

Sen balona en before_first_request() dekoratör, planlayıcıyı başlayabilir usta sürecinde çalışmasını zamanlayıcı önlemek gerekir . before_first_request() hep sunucu yeniden sonra ilk isteği ile tekrar adlandırılan olacağı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") 

Not.