В чем разница между обработкой запросов в режиме Django 3 ASGI и в режиме WSGI?

В ближайшее время должен быть выпущен Django 3, который сможет работать в режиме ASGI. Режим ASGI, похоже, делает Django более эффективным при обработке запросов, чем в режиме WSGI (если я правильно считаю, за единицу времени можно обрабатывать больше запросов). Как это достигается? Это похоже на то, что Django может обрабатывать одновременно несколько запросов, но большинство из них будут ожидать таких событий, как выборка данных из базы данных или другие операции ввода-вывода?

2 ответа

Решение

Основное отличие заключается в синхронном и асинхронном характере. Синхронный код блокировался, хотя работал в другом потоке или процессе и возвращал ответ. Не было триггерного подхода для чего-то еще.

Асинхронное программирование позволяет помещать кусок кода в цикл событий. Сделайте что-нибудь еще, пока оно не запустится, а затем после завершения сделайте с ним что-нибудь. Это неблокирующий подход, основанный на событиях.

Из документов

Что не так с WSGI?

Вы можете спросить: "Почему бы просто не обновить WSGI"? Об этом много раз спрашивали на протяжении многих лет, и проблема обычно заканчивается тем, что интерфейс WSGI с возможностью однократного вызова просто не подходит для более сложных веб-протоколов, таких как WebSocket.

Приложения WSGI - это один синхронный вызываемый объект, который принимает запрос и возвращает ответ; это не позволяет использовать долгоживущие соединения, как в случае соединений HTTP или WebSocket с долгим опросом.

Даже если мы сделаем этот вызываемый асинхронным, он все равно будет иметь только один путь для предоставления запроса, поэтому протоколы, которые имеют несколько входящих событий (например, получение кадров WebSocket), не могут это вызвать.

Как работает ASGI?

ASGI структурирован как один асинхронный вызываемый. Требуется область, которая содержит сведения о входящем запросе, send, ожидаемое, которое позволяет вам отправлять события клиенту, и получать ожидаемое, которое позволяет вам получать события от клиента.

Это не только разрешает несколько входящих и исходящих событий для каждого приложения, но также позволяет использовать фоновую сопрограмму, чтобы приложение могло выполнять другие действия (например, прослушивание событий внешнего триггера, например очереди Redis).

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

Другие вопросы по тегам