Celery task.delay在docker容器中被阻止

时间:2017-10-24 10:24:32

标签: django docker rabbitmq celery

我在django项目中使用芹菜。它适用于我的MacBook和CentOS VM。当我在docker容器中运行它时,包含add.delayadd是一项任务)方法的请求始终被阻止。

我在github上创建了一个演示项目:https://github.com/fengyouchao/proj_test

我的任务:

@shared_task
def add(x, y):
    return x + y

我的观点:

def index(request):
    a = int(request.GET.get('a', 1))
    b = int(request.GET.get('b', 2))
    add.delay(a, b)
    return HttpResponse("Hello world")


def hello(request):
    return HttpResponse("hello")

在演示项目中,我在docker-compose.yml中创建了三个服务:

  1. web - 运行“manage.py runserver 0.0.0.0:8000”
  2. 的服务
  3. 芹菜 - 运行“芹菜”的服务
  4. rabbitmq - 运行rabbitmq-server的服务
  5. 运行服务

    docker-compose up
    

    测试

    curl localhost:8000 # blocked
    
    curl localhost:8000/hello # OK
    

    在当前系统中运行django项目(在docker容器中使用相同的rabbitmq-server)

    manage.py runserver 0.0.0.0:18000
    

    测试

    curl localhost:18000 # OK , and the "celery" service printed task logs
    

    这个问题困扰了我很长一段时间,我不知道问题出在哪里。我希望有一个人可以帮助我。谢谢!

2 个答案:

答案 0 :(得分:0)

我刚刚遇到了类似的问题,

我使用Rabbitmq容器作为代理,因此在PT.style.format("{:.2%}") PT.style.format({'Col1': "{:,.0f}"}) print("{:,.2f}".format(PT))

中添加了CELERY_BROKER_URL

当我在django shell中运行settings.py的add.delay()时,它在容器内被击中,但在生产中运行正常

所以我添加了以下更改,它开始起作用

manage.py

答案 1 :(得分:0)

我也遇到了同样的问题,并通过如下方式解决了该问题:将在proj/proj/celery.py上创建的应用导入到proj/proj/__init__.py中,如下所示:

from __future__ import absolute_import, unicode_literals

# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app

__all__ = ('celery_app',)

您可以在Celery的first steps with django文档中查看更多信息。

希望有帮助!