/ / Django Asynchronous Processing - python, django, asynchronous, seler, cython

Django Asynchronous Processing - python, django, asynchronous, seler, cython

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ć:

  1. Odbierz żądanie AJAX
  2. Przydziel zadanie do dostępnego pracownika (bez blokowania głównej aplikacji WWW Django)
  3. Pracownik wykonuje zadanie w nieznanym czasie
  4. 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 № 1

Seler 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