Сельдерей, фляжка и докер - проблемы с логами и запущенными задачами - PullRequest
0 голосов
/ 11 ноября 2018

Я строю проект, используя Flask, Celery и Docker. Идея состоит в том, чтобы запускать длительные процессы из вызовов rest с помощью сельдерея, и большинство из них включают вызовы внешних API.

Прежде всего, проблема в том, что когда я запускаю контейнер, задачи вообще не запускаются, и я ничего не вижу в журналах, кроме:

INFO/MainProcess] Connected to redis://redis:6379/0
INFO/MainProcess] mingle: searching for neighbors
INFO/MainProcess] mingle: all alone
INFO/MainProcess] celery@34569b50965e ready.

Я использую док-контейнер для колбы, другой для сельдерея и еще один для Redis в качестве брокера (который используется сельдереем и колбой-сокетом.

  • в контейнере приложения фляги есть определение и экземпляр сельдерея
  • контейнер сельдерея использует изображение flaskapp, но запускает эту команду после активации virtualenv: celery worker -A app.controller.celery -l info

Затем я открываю журнал контейнера сельдерея: docker logs server_celery_1 -f, чтобы отслеживать выполнение задач.

Затем я открываю почтальон, делаю запрос в службу отдыха в приложении фляги, которое делегирует задачу сельдерею, но ничего не происходит.

Вот этот код:

def make_celery(_app):
    celery = Celery(
        _app.import_name,
        backend=_app.config['redis://redis:6379/1'],
        broker=_app.config['redis://redis:6379/0']
    )
    celery.conf.update(_app.config)


    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)



@app.route('/module/run', methods=['POST'])
@jwt_required
def run_module():
    req = request.get_json()
    module = req.get('module')
    json_input = req.get('input')
    logger.info('Running module: ' + req.get('module'))
    res = do.delay(module, json_input)
    return JSONEncoder().encode({'status': 'Task: ' + str(res) + ' submitted.'})


@celery.task()
def do(module_name, json_input):
    logger.info('____ Running ____')
    modules.run(module_name, json_input)

** НО ** ЕСЛИ я открываю приложение командной строки Celery events для наблюдения за задачами (похоже, это не актуально при использовании redis… или это так?)

celery -A app.controller.engine.celery events

и запустить некоторые задачи… (и ничего не происходит)… когда я дважды выхожу из окна событий сельдерея, дважды нажимая CTRL + C, и вдруг я вижу журналы в ленте журналов для контейнера сельдерея, журналы начали появляться и задачи начать бежать.

Чего мне не хватает?

Большое спасибо!

1 Ответ

0 голосов
/ 12 ноября 2018

Я вроде как исправил эту редкую проблему, запустив работника сельдерея с помощью eventlet:

celery worker -A app.controller.engine.celery -l info --concurrency=2 --pool eventlet

Я не до конца понимаю, почему он не работает со стандартным.

Буду признателен, если кто-нибудь сможет пролить свет на это.

Спасибо в любом случае

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...