2017-02-15 4 views
1

also ich versuche zu planen Aufgaben in meinem Kolben App zu feuern hin und wieder ... das funktioniert gut mit Flaschen Entwicklung Server, aber, wenn ich fire die gleiche App mit Gunicorn es funktioniert nicht wie vorgesehen , keine Fehler, aber keine Aufgaben gefeuert werden ..mit flask_apscheduler mit 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() 

so zum Zweck ich diese Probe umfassen, python myapp.py funktioniert gut und druckt 1 2 jede fünfte Sekunde ist jedoch gunicorn -w 1 -b 0.0.0.0:5000 myapp:app läuft nicht gedruckt 1 2 jeder fünfte Sekunde, warum ist das?

Antwort

2

so, 2 Dinge

1) Protokollierung verwenden, Sie viel mehr Informationen erhalten:

2) müssen Sie sich außerhalb Ihres if __name__=='__main__': Block erklären:

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

Ausgabe:

[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 

Das Problem:

Der Job wurde ursprünglich nicht ausgelöst. Das Problem war, dass Ihr Scheduler Definition (innerhalb des Blockes if __name__ == '__main__' war nur Dieser Code getroffen wird, wenn Sie die Python-Datei (Python myapp.py) direkt anrufen

Wenn Sie es mit Gunicorn ins Leben gerufen, die __name__ war nicht mehr Haupt, es war "myapp.py", also kam es nie zu dem Teil des Codes, der den Scheduler erstellte und hinzufügte :)

+0

(Ein gunicorn env zum testen bauen) – Kelvin

+0

wops, editing func. sollte 'myapp' sein, funktioniert nicht –

+0

kümmern sich um Protokollierung zu erarbeiten? Der Job wurde also ohne Protokollierung ausgelöst, aber nicht auf der Konsole ausgegeben. –