0

我将 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实际存在的地方才有意义,它不可能同时存在于多个节点上。

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

4

1 回答 1

2

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

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

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

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

另请参阅:如何使用同一工人重试芹菜?

希望有帮助。

于 2013-05-01T04:15:28.860 回答