perminovma
@perminovma

Как правильней всего отправлять HTTP запросы на сторонний сервис в Django?

Всем привет!

Мне нужно отправлять GET запрос на сторонний сервис через джанговские view.
На первый взгляд, можно просто делать:
r = requests.get("http://example.ru")
print r.status

Но на сколько я знаю, Django работает в один поток и, например, пока один пользователь отправив GET запрос дожидается ответа будет "висеть" весь сервер и другой пользователь даже послать запрос не сможет.

Так ли это?
И если это так, как правильней всего отправлять запросы во внешние сервисы? Через celery?

Заранее спасибо за ответ!
  • Вопрос задан
  • 2450 просмотров
Решения вопроса 1
kivsiak
@kivsiak
software engineer
В отличии от Алексея Букина вы понимаете почти правильно. Питон по умолчанию однопоточный. И если вы выполняете блокирующую операцию, а все операции над сокетами блокирующие, то будет заблокирован весь поток. Как правило сервер (uwsgi, gunicorn) запускает несколько потоков выполнения ( workers ) между которым деляться пользовательские запросы, но тем не менее в вашем случее каждый из них может подвиснуть на время выполнения операции над сокетом.

Бороться с этим можно двумя путями, первый - выполнять их в других процессах с использованием того же cellery. Правда тогда придется повозиться с тем чтобы отдать результат клиенту.

Второй попытаться использовать gevent который предоставит возможность асинхронной работы с сокетами. Копать надо в сторону gevent режима uwsgi демона.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы