2009-09-13 9 views
11

Jedna z moich funkcji widoku jest bardzo długim zadaniem przetwarzania i wyraźnie musi być traktowana inaczej. Zamiast zmuszać użytkownika do dłuższego czekania, najlepiej byłoby, gdybym był w stanie zjeść lunch, który wysłałby pocztą e-mail wyniki, a nie czekając na zakończenie powiadomić użytkownika, że ​​jego wniosek jest przetwarzany i pozwolić im przeglądać. Wiem, że mogę używać os.fork, ale zastanawiałem się, czy istnieje "właściwa droga" pod względem Django. Być może mogę zwrócić odpowiedź HTTP i jakoś dalej z tą pracą?Jak najlepiej uruchomić asynchroniczne zlecenie zadania w widoku Django?

+0

Duplikat: http: // stackoverflow .pl/questions/1352678/is-there-any-way-to-make-an-asynchronous-function-call-from-python-django/ –

+0

Moje złe, myślałem, że przeszukałem bardzo dokładnie! –

+0

Wygląda jednak na to, że niestety jest prosta odpowiedź. –

Odpowiedz

1

Dlaczego nie po prostu uruchomić thread, aby wykonać przetwarzanie, a następnie przejść do wysłania odpowiedzi?

10

Istnieje kilka rozwiązań tego problemu, a najlepsze zależą od tego, jak ciężki będzie Twój nakład pracy.

Jeśli masz lekki nakład pracy, możesz skorzystać z metody zastosowanej przez django-mailer, która ma zdefiniować model "jobs", zapisać nowe zadania w bazie danych, a następnie cron uruchomić samodzielny skrypt co jakiś czas, aby przetworzyć zadania przechowywane w bazie danych (usuwanie ich po zakończeniu). Możesz użyć funkcji podobnej do django-chronograph, aby ułatwić sobie planowanie zadań.

Jeśli potrzebujesz pomocy w zrozumieniu, jak napisać skrypt, aby przetworzyć pracę, zobacz artykuł James Bennetta o artykule Standalone Django Scripts, aby uzyskać pomoc.

Jeśli masz bardzo duże obciążenie, co oznacza, że ​​potrzebujesz więcej niż jednego serwera do przetworzenia zadań, wówczas chcesz użyć prawdziwej kolejki zadań dystrybucji. Tutaj jest duża konkurencja, więc nie mogę szczegółowo opisać wszystkich opcji, ale dobrym rozwiązaniem dla aplikacji Django jest celery.

1

Zanim wybierzesz rozwiązanie, musisz określić sposób jego uruchomienia. Czy jest to ten sam proces dla każdego użytkownika, dane są takie same i mogą być regularnie planowane? lub czy każdy użytkownik żąda czegoś, a wyniki są nieco inne?

Jako przykład, jeśli dane będą takie same dla każdego użytkownika i można je uruchomić według harmonogramu, można użyć crona.

Patrz: http://www.b-list.org/weblog/2007/sep/22/standalone-django-scripts/ lub http://docs.djangoproject.com/en/dev/howto/custom-management-commands/

Jednakże jeżeli wnioski będą adhoc i trzeba coś skalowalne, które mogą obsługiwać duże obciążenie i jest asynchroniczne: czego właściwie szuka to system kolejce wiadomość. Widok spowoduje dodanie żądania do kolejki, która zostanie następnie podjęta.

Istnieje kilka opcji, aby zaimplementować to w Django Django: serwis kolejka jest czysto Django & Python i proste, choć ostatni popełnić było w kwietniu, a wydaje się, że projekt został porzucony. http://code.google.com/p/django-queue-service/

Druga opcja jeśli potrzebujesz czegoś, wagi, jest rozprowadzany i korzysta z wiadomości open source kolejce serwerów: seler jest to, czego potrzebujesz

http://ask.github.com/celery/introduction.html http://github.com/ask/celery/tree

+0

Tak, wyniki są całkowicie różne na żądanie. –

+0

Demiurga, w takim przypadku musisz sprawdzić, jak często będzie to wymagane. Jeśli będzie to dużo, proponuję rozwiązanie kolejki. W ten sposób można zażądać widoku, dodać go do kolejki bez konieczności oczekiwania użytkownika na zakończenie. – ismail

Powiązane problemy