2015-05-09 94 views
1

我在兩臺機器上有兩個芹菜節點(n1,n2),我的任務入隊在另一臺機器上(主)。 主機可能不知道可用的節點名稱。 我的問題是,是否有任何保證任務鏈將在單個節點上運行。Python芹菜在單個節點上的任務鏈

res = chain(generate.s(filePath1, filePath2), mix.s(), sort.s()) 

問題是各種任務都使用本地數據文件,這些文件是特定於節點的。 我的猜測是,鏈可能是和絃,文檔明確表示,不能保證在單個節點上運行。 如果我對鏈條的猜測是正確的,那麼我的下一個問題是,以下是鏈接的替代方案的一個很好的解決方案嗎?

單任務=保證單個節點

@app.task 
def my_chain_of_tasks(): 
    celery.current_app.send_task('mymodel.tasks.generate', args=[filePath1, filePath2]).get() 
    celery.current_app.send_task('mymodel.tasks.mix').get() 
    # do these 2 in parallel: 
    res1 = celery.current_app.send_task('mymodel.tasks.sort') 
    res2 = celery.current_app.send_task('mymodel.tasks.email_in_parallel') 
    res1.get() 
    return res2.get() 

,或者這是仍然要任務發送到消息隊列和導致同樣的問題?

回答

2

您正在調用.get()對另一個反作用內的任務內的任務。也不保證所有這些任務將在單個節點上執行。

如果您希望特定節點執行一些任務,您可以對它們進行排隊或相應地路由它們。現在

CELERY_ROUTES = { 
    'mymodel.task.task1': {'queue': 'queue1'}, 
    'mymodel.task.task2': {'queue': 'queue2'} 
} 

你就可以開始兩個工人來消耗他們

celery worker -A your_proj -Q queue1 
celery worker -A your_proj -Q queue2 

現在所有task1將由worker1和task2通過worker2執行。

Docs:http://celery.readthedocs.org/en/latest/userguide/routing.html#manual-routing

+0

我有點困惑。我可以在主機上指定CELERY_ROUTES嗎?主機不運行芹菜。它只是排隊消息隊列中的任務。 – max

+0

那很好。你可以在celery配置文件中指定路由。當您在遠程計算機上運行worker時,它只會消耗來自代理 – ChillarAnand

+0

的相關任務,謝謝。讓我想出一個設置來嘗試一下;那麼我會標記你的答案。 – max