2017-02-15 206 views
1

所以我想安排我的燒瓶應用程序內的任務現在開火然後...這與燒瓶發展服務器很好,但是,一旦我用gunicorn火同一個應用程序它不按預期工作,沒有錯誤,但沒有任務被解僱..使用flask_apscheduler與gunicorn

from flask import Flask 
from flask_apscheduler import APScheduler 


class Config(object): 
    JOBS = [ 
     { 
      'id': 'job1', 
      'func': 'myapp:job1', 
      'args': (1, 2), 
      'trigger': 'interval', 
      'seconds': 5 
      } 
    ] 

    SCHEDULER_API_ENABLED = True 


def job1(a, b): 
    print(str(a) + ' ' + str(b)) 

app = Flask(__name__) 

if __name__ == '__main__': 
    app.config.from_object(Config()) 

    scheduler = APScheduler() 
    scheduler.init_app(app) 
    scheduler.start() 

    app.run() 

這樣的目的,我包括這樣,python myapp.py工作正常,並打印1 2每五秒,但是,運行gunicorn -w 1 -b 0.0.0.0:5000 myapp:app不打印1 2每五秒,爲什麼是這樣?

回答

2

因此,兩件事情

1)使用日誌記錄,你得到更多的信息:

2) 您需要在if __name__=='__main__':塊外聲明:

1 from flask import Flask 
    2 from flask_apscheduler import APScheduler 
    3 import logging 
    4 
    5 logging.basicConfig(level=logging.DEBUG, 
    6      format='%(asctime)s %(levelname)s %(message)s') 
    7 
    8 logger = logging.getLogger(__name__) 
    9 
10 class Config(object): 
11  JOBS = [ 
12   { 
13    'id': 'job1', 
14    'func': 'scratch:job1', 
15    'args': (1, 2), 
16    'trigger': 'interval', 
17    'seconds': 5 
18    } 
19  ] 
20 
21  SCHEDULER_API_ENABLED = True 
22 
23 
24 def job1(a, b): 
25  logger.info(str(a) + ' ' + str(b)) 
26 
27 app = Flask(__name__) 
28 app.config.from_object(Config()) 
29 
30 scheduler = APScheduler() 
31 scheduler.init_app(app) 
32 scheduler.start() 
33 
34 
35 if __name__ == '__main__': 
36   app.run() 
~ 
~ 

輸出:

[2017-02-15 14:29:39 +0000] [25122] [INFO] Booting worker with pid: 25122 
2017-02-15 14:29:39,817 INFO Adding job tentatively -- it will be properly scheduled when the scheduler starts 
2017-02-15 14:29:39,819 INFO Added job "job1" to job store "default" 
2017-02-15 14:29:39,819 INFO Scheduler started 
2017-02-15 14:29:39,820 DEBUG Looking for jobs to run 
2017-02-15 14:29:39,820 DEBUG Next wakeup is due at 2017-02-15 14:29:44.816072-05:00 (in 4.995362 seconds) 
2017-02-15 14:29:44,816 DEBUG Looking for jobs to run 
2017-02-15 14:29:44,817 INFO Running job "job1 (trigger: interval[0:00:05], next run at: 2017-02-15 14:29:44 EST)" (scheduled at 2017-02-15 14:29:44.816072-05:00) 
2017-02-15 14:29:44,817 INFO 1 2 

問題:

工作原本沒有開火。問題是,你的調度定義(是你的塊if __name__ == '__main__'此代碼,當你調用Python文件直接(蟒蛇myapp.py)

當你與Gunicorn推出只被擊中,在__name__不再是主內,它是「myapp.py」,所以它永遠不會到創建和添加調度程序的代碼部分:)

+0

(構建一個gunicorn env來測試) – Kelvin

+0

wops,編輯func。應該是'myapp',不能正常工作 –

+0

請注意詳細記錄日誌?所以事實上這項工作沒有使用日誌記錄而是觸發了,但沒有輸出到控制檯?更新的 –