2014-10-07 49 views
16

我的應用程序在頁面上收集一堆電話號碼。一旦用戶點擊提交按鈕,我創建一個芹菜任務來呼叫每個號碼並給出提醒消息,然後將其重定向到一個頁面,在那裏他們可以看到關於該呼叫的實時更新。我使用Web套接字來實時更新每個呼叫的狀態,並且需要同步執行的任務,因爲我只能從一個號碼撥出。創建芹菜任務,然後同步運行

所以一旦第一個通話/任務完成,我希望下一個通話/任務完成。

我看了一下CELERY_ALWAYS_EAGER設置,但它只是通過第一次迭代並停止。

如果你想火每個呼叫此起彼伏
@task 
def reminder(number): 
    # CODE THAT CALLS NUMBER HERE.... 

def make_calls(request): 
    for number in phone_numbers:      
     reminder.delay(number)  

    return redirect('live_call_updates') 
+0

您是否有每個電話號碼的芹菜任務,或者您是否使用芹菜異步啓動一個接一個的呼叫? – srj 2014-10-07 17:11:04

回答

4

,你爲什麼不換都在同一個任務調用

@task 
def make_a_lot_of_calls(numbers): 
    for num in numbers: 
     # Assuming that reminder blocks till the call finishes 
     reminder(number) 

def make_calls(request): 
    make_a_lot_of_calls.delay(phone_numers)       
    return redirect('live_call_updates') 
+0

重寫用於芹菜的任務有時可能是適當的,但在這裏似乎使得單個調用是任務的合適定義。 – JivanAmara 2015-06-04 20:12:53

16

如果你看你看,要synchronosuly調用任務celery DOCS on tasks,您使用apply()方法而不是apply_async()方法。

所以你的情況,你可以使用:

reminder.apply(args=[number]) 

該文檔還指出:
If the CELERY_ALWAYS_EAGER setting is set, it will be replaced by a local apply() call instead.

感謝@JivanAmara誰在評論中重申,使用適用()的時候,任務將在本地運行(在其中調用的服務器/計算機中)。如果您打算在多個服務器/機器上運行您的任務,這可能會產生分歧。

+1

請記住,使用apply()運行任務將同步運行,但也會在本地運行。如果您打算讓多臺機器進行處理,這是一個問題。 – JivanAmara 2015-06-04 20:12:31