2013-02-14 150 views
23

我在我的燒瓶應用程序中使用apscheduler時遇到問題。Flask中的apscheduler執行兩次

在我view.py文件我在每5秒

TEST 1360844314.01 試寫這樣

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

然後這個方法test_scheduler()執行兩次 1360844314.2

+0

請看看這裏,在Django有同樣的問題。 http://stackoverflow.com/a/27303834/573034 – Paolo 2014-12-09 13:55:37

回答

0

我已經做到了,我在add_interval_job參數中添加了一定的時間點後啓動

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

最好解決方案是使用add_cron_job('*')代替add_interval_job('*')

25

在調試模式下,瓶的reloader將加載燒瓶應用兩次(How to stop Flask from initialising twice in Debug Mode?)。我不確定這是爲什麼,但它會導致apscheduler的工作安排兩次。在sched.start()之前快速print "loaded scheduler"證實了這一點。

有一些方法可以解決這個問題,正如鏈接答案中提到的。我發現一個最好的工作僅僅是禁用,像這樣的reloader:

app.run(use_reloader=False) 

這意味着我必須重新加載我的應用程序手動因爲我開發它,但它是一個很小的代價獲得apscheduler工作。

+1

優秀的,只是我需要從谷歌入站的答案。 OP應該接受。 – DeaconDesperado 2013-03-21 14:16:10

+0

這個答案也適用於我,事實上是正確的答案。你能接受嗎? – stuxnetting 2014-02-12 15:40:01

13

使用重裝器時,有主進程和子進程。您的調度程序線程在兩者中運行。您需要防止調度從主進程中運行

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

是的,這有助於。我嘗試了很多選項,包括沒有成功的植絨文件。 – 2018-02-25 04:30:33

5

您就可以開始在瓶的before_first_request()裝飾,其中調度「註冊一個函數的第一個請求到應用的這個實例前運行」 。

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

請注意,before_first_request()將始終在服務器重新加載後用第一個請求再次調用。