如何使用Flask和Celery定期运行功能?

时间:2015-02-27 09:37:10

标签: python flask celery

我有一个大概看起来像这样的烧瓶应用程序:

app = Flask(__name__)
@app.route('/',methods=['POST'])
def foo():
   data = json.loads(request.data)
   # do some stuff

   return "OK"

现在另外我想从该脚本每10秒运行一次函数。我不想为此睡觉。我还有以下芹菜脚本:

from celery import Celery
from datetime import timedelta
celery = Celery('__name__')

CELERYBEAT_SCHEDULE = {
    'add-every-30-seconds': {
        'task': 'tasks.add',
        'schedule': timedelta(seconds=10)
    },
}



@celery.task(name='tasks.add')
def hello():
    app.logger.info('run my function')

脚本运行正常,但不执行logger.info。我错过了什么?

3 个答案:

答案 0 :(得分:7)

你有芹菜工人和芹菜打败吗?计划任务由 beat 处理,它将适当时提到的任务排队。 工作人员然后实际处理数字并执行您的任务。

celery worker --app myproject--loglevel=info
celery beat --app myproject

然而,您的任务看起来像是在调用Flask应用程序的记录器。使用工作人员时,您可能没有使用Flask应用程序(因为它在另一个进程中)。尝试使用普通的Python记录器进行演示任务。

答案 1 :(得分:2)

默认情况下,芹菜任务将在Flask应用程序上下文之外运行,因此无法访问Flask应用程序实例。但是,在使用Flask应用程序对象的app_context方法运行任务时,可以非常轻松地创建Flask应用程序上下文。

app = Flask(__name__)
celery = Celery(app.name)

@celery.task
def task():
    with app.app_context():
        app.logger.info('running my task')
Miguel Grinberg的

This article非常适合在Flask应用程序中使用Celery的基础知识。

答案 2 :(得分:1)

芹菜节拍也可以嵌入到普通的芹菜工作者中,在命令中带有-B参数。

celery -A --app myproject --loglevel=info -B

仅建议在开发环境中使用。对于生产,您应该像documentation所提到的那样,分别运行节拍和芹菜工人。否则,您的定期任务将运行多次。