我正在使用Celery设置从简单的Flask API调用的任务队列。但是,我遇到了一些奇怪的行为,即从Flask应用程序中的路由中调用Celery时,它们无法正常工作。
我将代码简化为以下代码,同时仍然遇到相同的错误。
from celery import Celery
import env_config as cfg
from flask import Flask
app = Flask(__name__)
app.config.update(
CELERY_BROKER_URL='pyamqp://guest@localhost//',
CELERY_RESULT_BACKEND='rpc://'
)
def make_celery(app):
celery = Celery(
app.name,
backend=app.config['CELERY_RESULT_BACKEND'],
broker=app.config['CELERY_BROKER_URL']
)
class ContextTask(celery.Task):
def __call__(self, *args, **kwargs):
with app.app_context():
return self.run(*args, **kwargs)
celery.Task = ContextTask
return celery
celery = make_celery(app)
@celery.task
def predict_job(job_id):
# do nothing
pass
@app.route('/predict_job', methods=['GET'])
def predict_job_route():
predict_job.delay(1)
return 'processing'
@app.route('/')
def index():
return "Flask app is working."
if __name__ == '__main__':
app.run(debug=False, host=cfg.ML_HOST, port=cfg.ML_PORT)
芹菜或烧瓶日志的响应为零。 我可以正常访问“ /”路由,并在Flask日志中看到GET请求。即
127.0.0.1 - - [12/Jun/2019 13:34:45] "[37mGET / HTTP/1.1[0m" 200 -
现在这是有趣的事情。如果我使用以下内容修改代码:
if __name__ == '__main__':
predict_job.delay(1)
app.run(debug=False, host=cfg.ML_HOST, port=cfg.ML_PORT)
然后,这第二个predict_job.delay()可以完全按预期运行,现在,原始的predict_job.delay()在通过路线访问时也可以正常工作。
以下是成功的Celery日志记录,供您参考:
[2019-06-12 13:41:30,464: INFO/MainProcess] Task app.predict_job[25a37d95-2060-4d8a-abff-c4d18804c03d] succeeded in 0.0s: None
答案 0 :(得分:0)
尝试在make_celery
通话后添加一行:
celery = make_celery(app)
celery.conf.update(app.config)
(检查configuration example from Flask-如您所见,您也可以在make_celery
函数中执行此操作)
此外,请确保输入run a celery worker。