【问题标题】:Celery task is always PENDING inside Docker container (Flask + Celery + RabbitMQ + Docker)Celery 任务在 Docker 容器中始终处于 PENDING 状态(Flask + Celery + RabbitMQ + Docker)
【发布时间】:2021-02-19 12:27:55
【问题描述】:

我正在创建一个basic project 来测试 Flask + Celery + RabbitMQ + Docker。

由于某种原因,我不知道,当我调用 celery 时,任务似乎调用了 RabbitMQ,但它始终处于 PENDING 状态,它永远不会更改为另一个状态。我尝试使用task.get(),但代码冻结。示例:

芹菜工人(例如worker_a.py)是这样的:

from celery import Celery

# Initialize Celery
celery = Celery('worker_a',
                broker='amqp://guest:guest@tfcd_rabbit:5672//',
                backend='rpc://')
[...]

@celery.task()
def add_nums(a, b):
   return a + b

虽然docker-compose.yml 是这样的:

  [...]
  tfcd_rabbit:
    container_name: tfcd_rabbit
    hostname: tfcd_rabbit
    image: rabbitmq:3.8.11-management
    environment:
      - RABBITMQ_ERLANG_COOKIE=test
      - RABBITMQ_DEFAULT_USER=guest
      - RABBITMQ_DEFAULT_PASS=guest
    ports:
      - 5672:5672
      - 15672:15672
    networks:
      - tfcd

  tfcd_worker_a:
    container_name: tfcd_worker_a
    hostname: tfcd_worker_1
    image: test_flask_celery_docker
    entrypoint: celery
    command: -A worker_a worker -l INFO -Q worker_a
    volumes:
      - .:/app
    links:
      - tfcd_rabbit
    depends_on:
      - tfcd_rabbit
    networks:
      - tfcd
  [...]

可以在here找到包含所有文件和运行说明的存储库。

有人知道会发生什么吗?

提前谢谢你。

【问题讨论】:

    标签: python docker rabbitmq celery


    【解决方案1】:

    过了一会儿,我的一个朋友发现了问题:

    创建任务时缺少正确的队列名称,因为 Celery 使用默认名称“celery”而不是正确的队列名称。

    最后的代码是这样的:

    [...]
    @celery.task(queue='worker_a')
    def add_nums(a, b):
       return a + b
    

    【讨论】:

      猜你喜欢
      • 2017-12-25
      • 1970-01-01
      • 2014-09-20
      • 1970-01-01
      • 1970-01-01
      • 2020-09-13
      • 1970-01-01
      • 1970-01-01
      • 2011-07-18
      相关资源
      最近更新 更多