2013-04-30 81 views
0

我使用芹菜與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實際存在上述任務纔有意義,這是不太可能,它會同時在多個節點上存在。

有沒有辦法指定給定的任務只能在本地執行?

回答

2

基本上,如果我正確理解你的問題,你應該有一個特定的工作人員從一個特定的隊列中讀取。

首先,您可以將隊列配置爲在celeryd級別上使用,例如,通過--queues選項啓動它:

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

然後,任務發送到特定的隊列中,您可以通過設置queue參數中使用apply_async

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

希望有所幫助。