仅本地消息队列?

时间:2013-04-30 21:11:50

标签: rabbitmq celery

我正在使用Celery和RabbitMQ。

对于我的用例,我肯定会有一些实例,我会在任何给定节点上执行消息,但是对于一个特定队列,我需要只执行 的操作原始服务器。这是因为它适用于仅限本地的文件:

@celery.task
def calculate_hash(filename):
    target = Models.objects.get(filename=filename)
    hasher = hashlib.md5()
    with open(filename, "rb") as f:
        chunk = f.read(64 * 1024)
        while len(chunk) > 0:
            hasher.update(chunk)
            chunk = f.read(64 * 1024)
    target.hash = hasher.hexdigest()
    target.save()

显然,上述任务仅在filename实际存在的情况下相关,并且它不可能同时存在于多个节点上。

有没有办法指定只在本地执行给定的任务?

1 个答案:

答案 0 :(得分:2)

基本上,如果我正确理解你的问题,你应该让一个特定的工人从一个特定的队列中读取。

首先,您可以将队列配置为在celeryd级别上使用,例如通过--queues选项启动它:

celeryd --queues=celery,queue1.mydomain.com

然后,要将任务发送到特定队列,可以通过设置queue参数来使用apply_async

另见:How to make celery retry using the same worker?

希望有所帮助。