2014-10-07 23 views
16

La mia app raccoglie una serie di numeri di telefono su una pagina. Quando l'utente preme il pulsante di invio, creo un'attività di sedici per chiamare ciascun numero e inviare un messaggio di promemoria, quindi reindirizzare a una pagina in cui possono visualizzare gli aggiornamenti in tempo reale sulla chiamata. Sto utilizzando i socket Web per aggiornare lo stato di ogni chiamata e ho bisogno che le attività vengano eseguite in modo sincrono, poiché ho solo accesso per comporre da un numero.Crea attività di sedici quindi esegui in modo sincrono

Quindi, una volta completata la prima chiamata/attività, desidero che venga attivata la successiva.

Ho dato un'occhiata alle impostazioni CELERY_ALWAYS_EAGER ma è appena passato alla prima iterazione e si è fermato.

@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

Hai un'attività celery per numero di telefono o stai utilizzando il sedano per avviare in modo asincrono le chiamate una per una? – srj

risposta

4

se si vuole sparare ogni chiamata uno dopo l'altro, perchè non si avvolgono tutte le chiamate in un compito

@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

A volte può essere opportuno riscrivere l'attività da utilizzare con sedano, ma qui sembra che una singola chiamata sia una definizione appropriata per un'attività. – JivanAmara

16

Se si guarda al celery DOCS on tasks si vede che per chiamare un compito synchronosuly, si utilizza il metodo apply() in opposizione al metodo apply_async().

Quindi nel tuo caso si potrebbe usare:

reminder.apply(args=[number]) 

i documenti noti inoltre che:
If the CELERY_ALWAYS_EAGER setting is set, it will be replaced by a local apply() call instead.

Grazie a @JivanAmara che nei commenti ha ribadito che quando si usa applicare(), il compito verrà eseguito localmente (nel server/computer in cui è chiamato). E questo può avere implicazioni, se intendevi eseguire le tue attività su più server/macchine.

+1

Ricordare che l'esecuzione di un'attività utilizzando apply() verrà eseguita in modo sincrono, ma verrà eseguita anche localmente. Questo è un problema se si intende avere più macchine che eseguono l'elaborazione. – JivanAmara