2014-10-07 28 views
16

Moja aplikacja zbiera kilka numerów telefonów na stronie. Gdy użytkownik kliknie przycisk przesyłania, utworzę zadanie selekcji, aby zadzwonić na każdy numer i przekazać komunikat przypominający, a następnie przekierować go na stronę, na której mogą zobaczyć aktualizacje na żywo dotyczące połączenia. Używam gniazd internetowych do aktualizacji statusu każdego połączenia i potrzebuję synchronizacji zadań, ponieważ mam dostęp tylko do wybierania numeru z jednego numeru.Twórz zadania związane z selera, a następnie uruchom synchronicznie

Tak więc po zakończeniu pierwszego połączenia/zadania, chcę, aby następny zadziałał.

Przyjrzałem się ustawieniom CELERY_ALWAYS_EAGER, ale po prostu przeszedłem pierwszą iterację i zatrzymałem się.

@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

czy masz zadanie selerowe według numeru telefonu, czy używasz selera do asynchronicznego uruchamiania połączeń jeden po drugim? – srj

Odpowiedz

4

jeśli chcesz odpalić każdą rozmowę jeden po drugim, dlaczego nie zawinąć wszystkie połączenia w jednym zadaniu

@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

Przepisanie zadania do użycia z selerem może być czasem odpowiednie, ale tutaj wydaje się, że pojedyncze wywołanie jest odpowiednią definicją dla zadania. – JivanAmara

16

Jeśli spojrzeć na celery DOCS on tasks widać, że do wywołania zadania synchronosuly, używasz metody apply() w przeciwieństwie do metody apply_async().

Więc w twoim przypadku można użyć:

reminder.apply(args=[number]) 

docs Zauważ też, że:
If the CELERY_ALWAYS_EAGER setting is set, it will be replaced by a local apply() call instead.

Dzięki @JivanAmara którzy w komentarzach powtórzył, że podczas korzystania apply(), zadanie uruchomi się lokalnie (na serwerze/komputerze, na którym się on nazywa). A to może mieć konsekwencje, jeśli zamierzasz wykonywać swoje zadania na wielu serwerach/komputerach.

+1

Należy pamiętać, że uruchomienie zadania za pomocą funkcji apply() będzie działać synchronicznie, ale będzie również działać lokalnie. Jest to problem, jeśli zamierzasz przetwarzać wiele maszyn. – JivanAmara