我正在使用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
实际存在的情况下相关,并且它不可能同时存在于多个节点上。
有没有办法指定只在本地执行给定的任务?
答案 0 :(得分:2)
基本上,如果我正确理解你的问题,你应该让一个特定的工人从一个特定的队列中读取。
首先,您可以将队列配置为在celeryd
级别上使用,例如通过--queues
选项启动它:
celeryd --queues=celery,queue1.mydomain.com
然后,要将任务发送到特定队列,可以通过设置queue
参数来使用apply_async。
另见:How to make celery retry using the same worker?
希望有所帮助。