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?
Odpowiedz
Dlaczego nie po prostu uruchomić thread, aby wykonać przetwarzanie, a następnie przejść do wysłania odpowiedzi?
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.
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
Tak, wyniki są całkowicie różne na żądanie. –
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
- 1. Zadania asynchroniczne Android wykonaj
- 2. Jak uruchomić asynchroniczne zapytania NHibenate?
- 3. Jak najlepiej uruchamiać jednorazowe zadania migracji w klastrze kubernetes
- 4. Jak uruchomić zadania Rake w skrypcie Ruby?
- 5. Jak uruchomić TDD w Django?
- 6. Rake: odpowiednik zadania w Django
- 7. Jak uruchomić zaległe zadania zaraz po ExecutorService.shutdown()?
- 8. Node.js Kue, jak ponownie uruchomić nieudane zadania
- 9. Jak uruchomić konsolę IRB z zadania prowizji?
- 10. Jak uruchomić kwerendę MySQL z zadania rake?
- 11. Jak mogę uruchomić instancję kontynuacji zadania?
- 12. Django - Jak uruchomić funkcję CODZIENNIE?
- 13. Jak używać buforowania z Django? (Najlepiej w GAE)
- 14. Sprawdzone metody: jak najlepiej implementować gwiazdki gwiazdkowe w szablonach Django
- 15. selera - zadania, które należy uruchomić w priorytecie
- 16. Jak debugować zadania Celery/Django działające lokalnie w środowisku Eclipse
- 17. Jak wyczyścić zadania Django RQ z kolejki?
- 18. Uruchamianie niestandardowego zadania manage.py Django na Heroku - problemy z importowaniem
- 19. Jak wyświetlić plik PDF w widoku Django?
- 20. jak pobrać plik FileField w widoku django
- 21. Jak uruchomić zadanie mieszania w ramach zadania mieszania?
- 22. Jak uruchomić zadanie pomruczeń w ramach zadania pomruczania?
- 23. Czy możliwe są asynchroniczne zapytania modelu Django?
- 24. zestaw język w widoku django
- 25. Testowanie widoku Django
- 26. Jak najlepiej zaktualizować węzeł XML w MSBuild
- 27. Akcje asynchroniczne w ASP.NET MVC 4
- 28. Jak uruchomić nginx + python (bez django)?
- 29. Jak uruchomić skrypty typu cron na Django?
- 30. Jak uruchomić powłokę django z Emacs?
Duplikat: http: // stackoverflow .pl/questions/1352678/is-there-any-way-to-make-an-asynchronous-function-call-from-python-django/ –
Moje złe, myślałem, że przeszukałem bardzo dokładnie! –
Wygląda jednak na to, że niestety jest prosta odpowiedź. –