2012-09-14 68 views
2

我要回調增加了一項功能,當它返回它可以調用一個常規的Python功能,如何設置芹菜回調

我的任務

@celery.task                                
def add(x, y):                               
    return x + y 

我想怎麼用它:

from __future__ import print_function 
delay.add(2, 3 ,callback=lambda x: print x) 

相反,拉姆達也可以是其無法在芹菜任務 但如果任務是從所謂的定義的任何功能。

+0

最新問題? – lolopop

回答

2

只能在這種情況下鏈接的任務:

add.apply_async((2, 3), link=other_task.s()) 

這是一樣的:

(add.s(2, 3) | other_task.s())() 

等待完成任務,使任務同步,因此呼叫你想會 相當於:

(lambda x: print(x))(add.delay(2, 3).get()) 

哪個會阻止當前進程un直到任務返回。 如果你不想讓進程阻塞,那麼你將不得不寫一個專門的線程來等待結果並調用你的回調函數。

或者你可以使用eventlet/gevent和幾乎寫正常的代碼。

+2

回調是否必須定義爲任務?因爲如果我有一個複雜的圖形,有大量的依賴節點,我必須聲明爲任務,那麼我所有的應用程序邏輯將在tasks.py中,這是不理想的... – Clara

+0

我想在我的回調中使用代碼'send_email.apply_async( ARGS = [json.dumps(有效載荷)], 交換= CELERY_EXCHANGE, routing_key = CELERY_ROUTING_KEY, 鏈路= save_email_response.subtask((invite_id,candidate.id,)) )',但它不是調用'save_email_response'。我已經使用'rdb' – Hussain

+0

驗證了這一點甚至嘗試過'(send_email.s(args = [json.dumps(payload)])| save_email_response.s(invite_id,candidate.id))(exchange = CELERY_EXCHANGE,routing_key = CELERY_ROUTING_KEY)'但確實有效。 – Hussain