Асинхронность в Django: бесконечная история

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

Хотя это и правда, что фреймворк Django поддерживает асинхронный Python, но он пока не поддерживает асинхронные представления (views) и промежуточное ПО. Это все должно появиться в следующей версии.

Согласно документации Django:

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

Мы допускаем что многие из вас могут не знать, что на самом деле означает асинхронность. Ведь возможно, вы просто использовали Python в том виде, в котором он есть. Поэтому мы проясним это понятие.

Что такое асинхронный код?

В отличии от Java и других мультипоточных языков, Python — язык однопоточный. Это означает, что в каждый отдельный момент времени он может выполнять только одну задачу, а не несколько.

Поскольку Django — это веб-фреймворк, построенный на основе Python, он также не является асинхронным. А это означает, что когда выполнение одной или нескольких операций занимает слишком много времени, в приложении Django происходит зависание представления. Это может быть проблемой.

Если вы попытаетесь смоделировать событие блокировки в представлении с заданным временем сна (sleep из библиотеки time в Python), вы заметите, что представление застревает на определенное время, прежде чем двигаться дальше.

Из этого наблюдения можно сделать вывод, что фреймворк Django без реализованных в нем очередей на самом деле не предназначен для операций, связанных со вводом-выводом, и это — серьезная проблема для разработчиков. Если вы программируете на Python, то, возможно, уже знаете: чтобы сделать код Python асинхронным, можно просто взять и использовать модуль asyncio.

Но как насчет Django? Как мне сделать его асинхронным?

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

Итак, о чем мы там раньше говорили?

Celery. Вот то, что нам нужно.

Библиотека Celery реализует асинхронную очередь задач, основанную на распределенной системе передачи сообщений. Она ориентирована на работу в реальном времени, но также поддерживает функцию планирования. Так что да, вы вполне можете реализовать асинхронные функции в Django.

С чего же нам начать?

В первую очередь мы рекомендуем обратиться непосредственно к документации самой библиотеки Сelery. Она весьма хорошо написана.

Надеемся, что данная статья дала вам ответ на вопрос, действительно ли фреймворк Django асинхронен.