我有一个大概看起来像这样的烧瓶应用程序:
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。我错过了什么?
答案 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所提到的那样,分别运行节拍和芹菜工人。否则,您的定期任务将运行多次。