Python 如何使用烧瓶和芹菜定期运行函数?

Python 如何使用烧瓶和芹菜定期运行函数?,python,flask,celery,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

我有一个烧瓶应用程序,大致如下:

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。我错过了什么?

你们有芹菜工人和芹菜打手吗?计划任务由beat处理,在适当的情况下,beat会对所提到的任务进行排队。然后,工人实际处理这些数字并执行您的任务

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

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

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

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

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

Miguel Grinberg是一个非常好的地方,可以让您了解在烧瓶应用中使用芹菜的基本知识。

好的,芹菜节拍也可以嵌入普通芹菜工人中,命令中有-B参数

芹菜-A--app myproject--loglevel=info-B


建议仅在开发环境中使用。对于生产,如前所述,您应该分别运行beat和芹菜工人。否则,您的定期任务将运行多次。

是否无法在flask应用程序中运行芹菜任务?在这种情况下,芹菜可能不是您想要的。查看更简单的实现。至少在2020年6月,应该标记为正确答案