Celery,flask和Docker-日志和运行任务问题

时间:2018-11-11 08:37:06

标签: python docker flask celery

我正在使用Flask,Celery和Docker构建一个项目。 这个想法是使用芹菜从其余调用中运行耗时的过程,其中大多数涉及对外部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.

我正在为flask应用程序使用docker容器,为celery工作者使用另一个容器,并为redis作为代理使用(由celery和flask-socketio使用。

  • flask应用程序容器上有celery定义和实例
  • 芹菜容器使用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退出celery事件窗口时,突然我在celery容器的日志供稿中看到日志,日志开始出现,并且任务开始运行。

我想念什么?

非常感谢!

1 个答案:

答案 0 :(得分:0)

我通过使用eventlet启动芹菜工作者来解决此罕见问题:

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

我不完全理解为什么它不能与默认值一起使用。

如果有人能对此有所启发,我将不胜感激。

仍然感谢