2012-02-29 24 views
6

Pracuję na serwerze WWW django, na którym inny komputer (ze znanym adresem IP) może załadować arkusz kalkulacyjny na mój serwer WWW. Po zaktualizowaniu arkusza kalkulacyjnego w wersji chcę wywołać niektóre przetwarzanie/sprawdzanie poprawności/analizę w arkuszu kalkulacyjnym (co może zająć> 5 minut - zbyt długo, aby drugi serwer mógł rozsądnie poczekać na odpowiedź), a następnie wysłać drugie maszyna (ze znanym adresem IP) HttpResponse wskazująca, że ​​przetwarzanie danych zostało zakończone.funkcja wyzwalacza po zwróceniu HttpResponse z widoku django

Zdaję sobie sprawę, że nie można zrobić processing.data() po powrocie się HttpResponse, ale funkcjonalnie chcę kod, który wygląda mniej więcej tak:

# processing.py 
def spreadsheet(*args, **kwargs): 
    print "[robot voice] processing spreadsheet........." 
    views.finished_processing_spreadsheet() 

# views.py 
def upload_spreadsheet(request): 
    print "save the spreadsheet somewhere" 
    return HttpResponse("started processing spreadsheet") 
    processing.data() 

def finished_processing_spreadsheet(): 
    print "send good news to other server (with known IP)" 

wiem jak napisać każdą funkcję indywidualnie, ale jak mogę skutecznie zadzwoń pod numer processing.data()po tym, jakviews.upload_spreadsheet zwrócił odpowiedź?

Próbowałem używać django's request_finished signaling framework, ale to nie wywołuje metody processing.spreadsheet() po zwrocie HttpResponse. Próbowałem użyć dekoratora na views.upload_spreadsheet z tym samym problemem.

Mam przeczucie, że może to mieć coś wspólnego z pisaniem middleware lub prawdopodobnie custom class-based view, z których żadne nie mam żadnego doświadczenia, więc pomyślałem, że postawię pytanie wszechświatowi w poszukiwaniu jakiejś pomocy.

Dzięki za pomoc!

Odpowiedz

4

W rzeczywistości Django ma syncroniczny model. Jeśli chcesz wykonać prawdziwe przetwarzanie asynchroniczne, potrzebujesz kolejki komunikatów. Najczęściej używany z django to seler, może wyglądać nieco "przesadnie", ale jest to dobra odpowiedź.

Dlaczego potrzebujemy tego? ponieważ w aplikacji wsgi apache przekazuje żądanie do pliku wykonywalnego, a plik wykonywalny zwraca tekst. Tylko jeden raz, gdy plik wykonywalny zakończy jego wykonywanie, apache poznaje koniec żądania.

+0

Dziękuję za wyjaśnienie, dlaczego jest to konieczne, Cristophe. Opierając się na twoim i jpicowym wyjaśnieniu, myślę, że sprawdzę selera po tym, jak trochę dłużej będę spać. – dino

3

Problem z wdrożeniem polega na tym, że liczba przetwarzanych arkuszy kalkulacyjnych jest równa liczbie pracowników: witryna nie będzie już odpowiadać.

Należy użyć tła zadanie kolejkę, w zasadzie mają 2 procesy: serwer i menedżera zadań tła. Serwer powinien delegować przetwarzanie arkusza kalkulacyjnego do menedżera zadań w tle. Gdy zadanie w tle zostanie wykonane, powinno jakoś poinformować serwer. Na przykład może zrobić model_with_spreadsheet.processed = datetime.datetime.now().

Należy użyć menedżer tło praca jak django-ztask (bardzo łatwa konfiguracja) celery (bardzo mocny, prawdopodobnie przesada w danym przypadku) lub nawet uwsgi spooler (co oczywiście wymaga uwsgi wdrożenie).

+0

Dzięki za szybką odpowiedź. Opierając się na odpowiedziach twojego i Christophe'a31, myślę, że sprawdzę selera po tym, jak trochę dłużej będę spać. – dino

+0

zamknij pytanie, proszę – jpic

Powiązane problemy