2012-05-18 48 views
2

所以我有一個非常有趣的場景,我想根據它調用的地方運行相同的Celery任務,例如,我想爲高級用戶運行任務優先級高於非高級用戶。使用Celery以不同的優先級運行相同的任務

使用文檔,我能夠設置多個隊列,並能夠通過將所有.delay調用更改爲.apply_async調用並傳入指定優先隊列的其他routing_key來獲得此功能。問題是不得不在很多不同的地方這樣做。有沒有更好的方法來處理這個問題?我試圖儘量避免更改我的視圖中的代碼,並希望在任務或芹菜配置中處理此問題。

+0

爲什麼不把它做成不同的任務? – santiagobasulto

+0

然後我會有相同的邏輯重複,所以我試圖避免這一點。我的另一個想法是傳遞額外的參數來指示優先級,並編寫一個任務路由器來確定哪個路由密鑰通過。 –

+0

使它成爲一個單獨的函數,你有def func(params),並且在這兩個任務中你都可以調用相同的函數。單元測試也更容易。 – santiagobasulto

回答

3

您可以使用部分評估而不是定義單獨的任務。

from celery.task import task 
from functools import partial 

@task 
def do_something(): 
    pass 

premium_do_something = partial(do_something.apply_async, routing_key="premium") 

do_something.async_apply() 
premium_do_something() 
+0

啊,這很聰明。這將我定義的任務從3個減少到2個。基本任務將使用默認路由密鑰,並且保費將通過它自己。有沒有辦法做到這一點使用.delay vs .apply_async - 基於文件看起來好像只有.apply_async接受routing_key參數。 –

+0

延遲僅適用於簡單情況。它不接受routing_key。 – mher

相關問題