Обработка одновременных запросов с Django API - PullRequest
0 голосов
/ 26 февраля 2020

Я хотел бы создать простой API отдыха с DRF (https://www.django-rest-framework.org/). Другая служба собирается делать запросы, в которых она предоставляет JSON. Этот json анализируется, и будут выполняться некоторые довольно простые pandas операции с кадрами данных. Результат отправляется обратно через JSON.

Есть ли способ сделать этот процесс многопоточным? Несмотря на то, что операции pandas довольно просты, они все равно могут занять ~ 0,5 с-1 с, и я бы хотел, чтобы люди не ждали несколько секунд, если по какой-то причине 3-4 таких запроса было сделано в один и тот же момент. .

Спасибо!

Ответы [ 2 ]

3 голосов
/ 26 февраля 2020

Развернули ли вы свой API с помощью YourAPIScript.py runserver?

Насколько я помню, он однопоточный, поэтому он не сможет начать обработку одного запроса, пока не завершит обработку другого.

Решения:

  1. Если вы используете более ориентированный на производство сервер WSGI, например, uwsgi, его можно настроить для обслуживания более одного запроса одновременно. Попробуйте этот урок из Django документов: Как использовать Djanog с uwsgi
  2. Если вы используете gunicorn, вы можете либо увеличить количество рабочих и потоков, либо переключить рабочий класс на не - блокирующий один gevent или eventlet (http://docs.gunicorn.org/en/stable/settings.html#id75). Для рабочего числа и потоков значения по умолчанию равны 1, что означает, что по умолчанию вы получаете параллелизм 1 запроса.
  3. Для этого вы также можете использовать очередь задач. Большинство людей используют сельдерей .
1 голос
/ 26 февраля 2020

По моему мнению, было бы неплохо избегать решения этой проблемы с многопоточностью. Это может работать лучше следующим образом:

  1. Клиент отправляет JSON в API;
  2. API создает Задача Celery для обработки JSON, затем возвращает какой-то вид идентификатора или URL-адреса, где будет храниться результат;
  3. процессы задачи Celery JSON в фоновом режиме;
  4. Когда результат будет готов, внешняя служба может получить его с помощью идентификатора или URL-адреса с шага 2 .

По моему мнению, обработка JSON с Pandas - это не то, что вы хотели бы делать в процессе запрос-ответ, она лучше подходит для архитектуры асинхронных задач. Сегодня это может занять 0,5-1 секунды, но, возможно, завтра это займет 10 секунд и повесит ваше приложение

...