【发布时间】:2014-02-10 21:10:25
【问题描述】:
我正在使用 django 1.4、celery 3.0、rabbitmq
为了描述这个问题,我在一个系统中有许多内容网络,我想要一个队列来处理与每个网络相关的任务。
但是,当系统运行时,内容是动态创建的,因此我需要动态创建队列并让现有工作人员开始处理它们。
我已经尝试通过以下方式调度任务(其中内容是 django 模型实例):
queue_name = 'content.{}'.format(content.pk)
# E.g. queue_name = content.0c3a92a4-3472-47b8-8258-2d6c8a71e3ba
add_content.apply_async(args=[content], queue=queue_name)
这将创建一个名为 content.0c3a92a4-3472-47b8-8258-2d6c8a71e3ba 的队列,创建一个名为 content.0c3a92a4-3472-47b8-8258-2d6c8a71e3ba 和路由键 content.0c3a92a4-3472-47b8-8258-2d6c8a71e3ba 的新交换,并将任务发送到该队列。
但是我从来没有看到工人接手这些任务。我当前设置的工人没有监听任何特定的队列(未使用队列名称初始化)并接手发送到默认队列就好了。我的 Celery 设置是:
BROKER_URL = "amqp://test:password@localhost:5672/vhost"
CELERY_TIMEZONE = 'UTC'
CELERY_ALWAYS_EAGER = False
from kombu import Exchange, Queue
CELERY_DEFAULT_QUEUE = 'default'
CELERY_DEFAULT_EXCHANGE = 'default'
CELERY_DEFAULT_EXCHANGE_TYPE = 'direct'
CELERY_DEFAULT_ROUTING_KEY = 'default'
CELERY_QUEUES = (
Queue(CELERY_DEFAULT_QUEUE, Exchange(CELERY_DEFAULT_EXCHANGE),
routing_key=CELERY_DEFAULT_ROUTING_KEY),
)
CELERY_CREATE_MISSING_QUEUES = True
CELERYD_PREFETCH_MULTIPLIER = 1
知道如何让工作人员接手发送到这个新创建队列的任务吗?
【问题讨论】:
-
为什么不只使用一个队列并将
content.pk作为参数传递呢?创建新队列还有什么好处? -
可能的附加好处是:如果需要,可以为接收大量流量的内容网络启动专门的工作人员。也用于统计和日志封装等。
标签: django queue celery amqp worker