Я строю проект, используя 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, и вдруг я вижу журналы в ленте журналов для контейнера сельдерея, журналы начали появляться и задачи начать бежать.
Чего мне не хватает?
Большое спасибо!