Django

Асинхронность в 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 асинхронен.

Ilyaragalin

Recent Posts

10 удалённых Python-вакансий

Если вы ищете работу на Python, на Talanto.work сейчас есть варианты для junior, middle, senior…

6 месяцев ago

Где искать Python-вакансии в 2026 году: зачем на Talanto.work появился отдельный сценарий поиска

Рынок Python-вакансий большой, но удобным его назвать сложно. Формально вакансий много, однако в реальном поиске…

6 месяцев ago

Срезы в Python со всеми подробностями

Срезы в Python — это больше, чем a[2:7]. В статье — быстрый разбор полезных приёмов:…

8 месяцев ago

Возведение в степень в Python: полное руководство

В этой статье мы рассмотрим возведение в степень в Python с помощью различных методов, от…

9 месяцев ago

Как удалить дубликаты из списка Python?

Дубликаты в списке Python — частая проблема. В статье показано, как быстро убрать повторы, в…

9 месяцев ago

Виртуальный (shared) хостинг от SpaceWeb: технический обзор

Услуга виртуального хостинга на SpaceWeb позволяет арендовать часть сервера (shared-сервера) и разместить на нём свой…

11 месяцев ago