Celery、flask 和 Docker - 日志和 运行 任务的问题
Celery, flask and Docker - Issues with the logs and running tasks
我正在使用 Flask、Celery 和 Docker 构建一个项目。
这个想法是 运行 使用 celery 进行休息调用的耗时过程,其中大部分涉及对外部 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.
我正在使用一个 docker 容器用于 flask 应用程序,另一个用于 celery worker,另一个用于 redis 作为代理(由 celery 和 flask-socketio 使用。
- flask 应用程序容器上有 celery 定义和实例
- celery 容器使用 flaskapp 镜像,但 运行 在激活 virtualenv 后执行此命令:
celery worker -A app.controller.celery -l info
然后我打开celery容器的日志:docker logs server_celery_1 -f
为了监控任务是运行ning.
然后我打开邮递员,向 flask 应用程序中的 rest 服务发出请求,该请求将任务委托给 celery,...但没有任何反应。
这里是涉及到的代码:
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 事件命令行应用程序来监视任务(这看起来与使用 Redis 时无关……是吗?)
celery -A app.controller.engine.celery events
和 运行 一些任务……(没有任何反应)……当我通过按 CTRL+C a 两次退出芹菜事件 window 时,突然我在芹菜的日志提要中看到日志容器,日志开始出现,任务开始 运行。
我错过了什么?
非常感谢!
我通过使用 eventlet 启动 celery worker 解决了这个罕见的问题:
celery worker -A app.controller.engine.celery -l info --concurrency=2 --pool eventlet
我不完全明白为什么它不能与默认的一起使用。
如果有人能对此有所启发,我将不胜感激。
谢谢大家
我正在使用 Flask、Celery 和 Docker 构建一个项目。 这个想法是 运行 使用 celery 进行休息调用的耗时过程,其中大部分涉及对外部 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.
我正在使用一个 docker 容器用于 flask 应用程序,另一个用于 celery worker,另一个用于 redis 作为代理(由 celery 和 flask-socketio 使用。
- flask 应用程序容器上有 celery 定义和实例
- celery 容器使用 flaskapp 镜像,但 运行 在激活 virtualenv 后执行此命令:
celery worker -A app.controller.celery -l info
然后我打开celery容器的日志:docker logs server_celery_1 -f
为了监控任务是运行ning.
然后我打开邮递员,向 flask 应用程序中的 rest 服务发出请求,该请求将任务委托给 celery,...但没有任何反应。
这里是涉及到的代码:
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 事件命令行应用程序来监视任务(这看起来与使用 Redis 时无关……是吗?)
celery -A app.controller.engine.celery events
和 运行 一些任务……(没有任何反应)……当我通过按 CTRL+C a 两次退出芹菜事件 window 时,突然我在芹菜的日志提要中看到日志容器,日志开始出现,任务开始 运行。
我错过了什么?
非常感谢!
我通过使用 eventlet 启动 celery worker 解决了这个罕见的问题:
celery worker -A app.controller.engine.celery -l info --concurrency=2 --pool eventlet
我不完全明白为什么它不能与默认的一起使用。
如果有人能对此有所启发,我将不胜感激。
谢谢大家