Задачи, не достигающие Celery из Flask, но только при вызове из маршрута приложения Flask - PullRequest
0 голосов
/ 12 июня 2019

Я использую Celery для настройки очереди задач, которая вызывается из простого Flask API.Однако я сталкиваюсь с некоторым странным поведением, когда Celery не работает, когда вызывается из маршрута в приложении Flask.

Я сократил код до следующего, все еще получая ту же ошибку.

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)

От журналов «Сельдерей» или «Колба» не получено ни одного ответа.Я могу получить доступ к маршруту '/' в обычном режиме и увидеть запрос GET в журналах Flask.Т.е.

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)

Тогда не только этот второй Предикат_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

1 Ответ

0 голосов
/ 12 июня 2019

Попробуйте добавить строку после вашего make_celery вызова:

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

(посмотрите пример конфигурации с Flask - как вы можете видеть, вы также можете сделать это с помощью функции make_celery)

Кроме того, обязательно запустите работника сельдерея .

...