【发布时间】:2018-11-11 08:37:06
【问题描述】:
我正在使用 Flask、Celery 和 Docker 构建一个项目。 这个想法是使用 celery 从 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.
我为烧瓶应用程序使用一个 docker 容器,另一个用于 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 以监控任务是否正在运行。
然后我打开邮递员,向烧瓶应用程序中的其余服务发出请求,该服务将任务委托给 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 events 命令行应用程序来监视任务(使用 redis 时这看起来不相关……或者是吗?)
celery -A app.controller.engine.celery events
并运行一些任务……(什么也没发生)……当我按 CTRL+C a 两次退出 celery 事件窗口时,突然我在 celery 容器的日志提要中看到日志,日志开始出现并且任务开始运行。
我错过了什么?
非常感谢!
【问题讨论】:
-
您确定代理网址正确吗?我本来希望像 redis://redis:6379/0
-
据我所知,如果没有指定,它默认使用 0。但是我现在添加了它,我将 0 设置为代理,1 用于后端,2 用于套接字 io。无论如何,同样的事情,所有任务都处于挂起状态,除非发生某些事情(比如运行和退出事件 gui),否则不会运行......仍然无法理解为什么。
-
我已经意识到,有时它在我启动容器后就可以正常工作,有时却不行。没有记录错误。很奇怪。
-
我还看到,在启动容器后,提交的任务并没有启动,直到我进入 celery 容器并运行任何 celery 命令,即
celery -A app.controller.engine.celery inspect stats,然后事情“解锁”并开始工作......有什么想法吗?
标签: python docker flask celery