最近使用了celery,但用着感覺不是很爽,因爲它需要把worker和任務調用的邏輯放在同一個工程裏面。所以,當分佈式使用時,需要將這個工程複製到不同的機器上,而不是將worker與任務調用的邏輯分開。
這段時間都在思考如何擺脫這個限制,想到了一個方案:
- 一般,celery任務調用如下:
@app.task
def add(x, y):
return x + y
from tasks import add
add.delay(4, 4)
以上調用都是基於可以引用到方法add的基礎上可行的
-
那麼我們如果把沒有什麼特殊限制的任務在這個基礎上做的更通用一點是不是可以更好一點,如果在再在這個通用的基礎上做成一個基礎庫,到需要配置的機器上安裝,就可以在不同的工程上直接使用了,不必worker和任務調用邏輯混在一起了
-
如何通用?
聯想到http請求,我們只要綁定自己的請求參數,請求方法,訪問對應的url就行了,這都是統一的。
參考其數據結構,我們可以定義一個通用的方法,例子爲:客戶端:
@app.task def revoke_task(method, data): taskhandler = get_handler(method) result = taskhandler.deal(data) return result
簡單的想法如上文所說,由於沒有考慮celery中頻率限制等特性,因此,上述的方案看來只適用於那些沒有什麼條件限制的任務。
望大家指正!