2015-04-01 76 views
0

我在Celery的tasks.py中有幾項任務。如何在Celery中的隊列之間切換任務

# this should go to the 'math' queue 
@app.task 
def add(x,y): 
    uuid = uuid.uuid4() 
    result = x + y 
    return {'id': uuid, 'result': result} 

# this should go to the 'info' queue 
@app.task 
def notification(calculation): 
    print repr(calculation) 

我希望做的是這些任務在單獨的芹菜隊列,然後分配在每個隊列多名工人。

問題是,我不知道一種方法來從我的代碼中從一個隊列到另一個隊列任務

因此,例如,當add任務完成執行時,我需要一種方法將生成的Python字典放到info隊列中以進一步處理。我應該怎麼做?

在此先感謝。

編輯-CLARIFICATION-

正如我在評論中說,這個問題從本質上變成如何檢索從queue Aqueue B工人的地方的數據。

+0

芹菜任務對象自帶的' apply_async'方法,它可以用來指定你想發送t的隊列通過指定隊列參數來請求,例如'getSystemInfo.apply_async(queue = queueList [i])' 您可以讓工作人員只通過添加-Q選項來偵聽特定隊列,例如'--app = dir.app --loglevel = INFO -Q '。一旦完成了這一切,你只需要一些內部的書籍來了解哪個隊列得到什麼任務 '' – cmidi 2015-04-01 15:19:21

+0

@cmidi足夠公平。但本質上,問題是工作人員如何將數據從'隊列A'檢索到'隊列B'...... – kstratis 2015-04-01 15:22:15

+0

這就是我沒有把它作爲答案的原因,我不清楚這個問題到底是什麼。這些任務是否會一個接一個地運行,還是可以在不同的隊列中同時運行?你想從一個運行任務的結果提供給另一個,或者你想參數? – cmidi 2015-04-01 15:31:10

回答

1

你可以試試這個。

無論您何時調用任務,都可以將任務分配到哪個隊列。

add.apply_async(queue="queuename1") 

notification.apply_async(queue="queuename2") 

通過這種方式,你可以把任務放在單獨的隊列中。

工人的獨立隊列

celery -A proj -Q queuename1 -l info 

celery -A proj -Q queuename2 -l info 

但你必須知道,default隊列celery。所以,如果不指定queue name將轉到celery queue.So需要一種celery消費者任何任務,如果有喜歡的。

celery -A proj -Q queuename1,celery -l info 

爲了您預期的答案

如果你想一個任務的結果傳遞給another.Then

result = add.apply_async(queue="queuename1") 
result = result.get() #This contain the return value of task 

然後

notification.apply_async(args=[result], queue="queuename2") 
+0

是的,但數據傳輸將如何發生?我的意思是'queuname2'如何檢索返回的字典(從我的例子中的'queuename1')? – kstratis 2015-04-01 15:27:07

+0

更新了答案 – itzMEonTV 2015-04-01 16:09:58

+0

太好了。還有一件事:有沒有辦法保存任務'id'?給你一個例子,如果這個'result'在整個處理週期中都能保持相同的'id',那將是非常棒的。 – kstratis 2015-04-01 16:17:03

相關問題