Mam kilka żądań Django, które się wykonująniektóre obliczenia matematyczne (napisane w C i wykonane za pomocą modułu Cython), których wykonanie może zająć nieokreśloną ilość (rzędu 1 sekundy). Również żądania nie muszą uzyskiwać dostępu do bazy danych i wszystkie są od siebie niezależne i Django.
W tej chwili wszystko jest synchroniczne (przy użyciu Gunicorn z sync
typy pracowników), ale chciałbym zrobić to asynchronicznie i nieblokująco. Krótko mówiąc, chciałbym coś zrobić:
- Odbierz żądanie AJAX
- Przydziel zadanie do dostępnego pracownika (bez blokowania głównej aplikacji WWW Django)
- Pracownik wykonuje zadanie w nieznanym czasie
- Django zwraca wynik obliczenia (listę ciągów znaków) jako JSON po zakończeniu zadania
Jestem bardzo nowy w asynchronicznym Django, więc moje pytanie brzmi, jaki jest najlepszy stos do tego celu.
Czy ten rodzaj procesu jest odpowiedni dla kolejki zadań? Czy ktoś poleciłby Tornado + Celery + RabbitMQ, a może coś innego?
Z góry dziękuję!
Odpowiedzi:
14 dla odpowiedzi № 1Seler byłby do tego idealny.
Ponieważ to, co robisz, jest stosunkowo proste(czytaj: nie potrzebujesz skomplikowanych zasad dotyczących sposobu kierowania zadań), prawdopodobnie możesz uciec się do korzystania z backendu Redis, co oznacza, że nie musisz konfigurować / konfigurować RabbitMQ (co z mojego doświadczenia jest bardziej trudny).
Używam Redis z najbardziej deweloperską wersją Celery, a oto odpowiednie fragmenty mojej konfiguracji:
# Użyj redis jako kolejki BROKER_BACKEND = "kombu.transport.pyredis.Transport ” BROKER_HOST = "localhost" BROKER_PORT = 6379 BROKER_VHOST = „0” # Przechowuj wyniki w Redis CELERY_RESULT_BACKEND = "redis" REDIS_HOST = "localhost" REDIS_PORT = 6379 REDIS_DB = „0”
Ja też używam django-celery
, co sprawia, że integracja z Django jest szczęśliwa.
Skomentuj, jeśli potrzebujesz bardziej szczegółowych porad.
0 dla odpowiedzi nr 2
Ponieważ planujesz uczynić go asynchronicznym (prawdopodobnie używając czegoś takiego jak gevent), możesz również rozważyć utworzenie wątkowej / rozwidlonej wewnętrznej usługi zaplecza do pracy obliczeniowej.
Serwer frontonu asynchronicznego może obsłużyć wszystkielekka praca, pobieranie danych z baz danych, które są odpowiednie dla asynchronizacji (redis lub mysql ze specjalnym sterownikiem) itp. Gdy obliczenia muszą zostać wykonane, serwer frontendowy może wysłać wszystkie dane wejściowe do serwera backendowego i pobrać wynik, gdy serwer zaplecza jest obliczony.
Ponieważ serwer frontonu jest asynchroniczny, nie będzieblokuj podczas oczekiwania na wyniki. Zaletą tego, w przeciwieństwie do używania selera, jest to, że możesz zwrócić wynik klientowi, gdy tylko będzie on dostępny.
client browser <> async frontend server <> backend server for computations