首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将flask_apscheduler与gunicorn结合使用

将flask_apscheduler与gunicorn结合使用
EN

Stack Overflow用户
提问于 2017-02-16 03:00:31
回答 1查看 4.5K关注 0票数 4

我正在尝试在我的flask应用程序中计划任务,以便时不时地触发...这在flask开发服务器上工作得很好,但是一旦我用gunicorn启动了相同的应用程序,它就不能按预期工作,没有错误,但没有任务被触发。

代码语言:javascript
复制
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,为什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-16 03:19:53

所以,有两件事

1)使用日志记录,您可以获得更多信息:

2)你需要在你的if __name__=='__main__':块之外声明:

代码语言:javascript
复制
  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()
~
~

输出:

代码语言:javascript
复制
[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文件(python myapp.py)时才会命中此代码

当您使用Gunicorn启动它时,__name__不再是main,它是"myapp.py“,因此它永远不会到达创建和添加调度程序的代码部分:)

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42257942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档