任务不会从 Flask 到达 Celery,但仅在从 Flask 应用路由调用时到达



我正在使用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(( 在通过路由访问时工作正常。

作为参考,这里是成功的芹菜日志记录:

[2019-06-12 13:41:30,464: INFO/MainProcess] Task app.predict_job[25a37d95-2060-4d8a-abff-c4d18804c03d] succeeded in 0.0s: None

尝试在make_celery呼叫后添加一行:

celery = make_celery(app)
celery.conf.update(app.config)

(查看 Flask 中的配置示例 - 如您所见,您也可以在 make_celery 函数中执行此操作(

此外,请确保运行芹菜工人。

相关内容

  • 没有找到相关文章

最新更新