Django: синхронні vs асинхронні представлення

У цій статті йдеться про те, як покращити продуктивність Django додатка за допомогою асинхронних представлень (views), щоб зменшити час очікування операцій введення/виведення (I/O bound operations). Ми також порівняємо синхронні та асинхронні представлення, з'ясуємо, як створити асинхронне представлення, і як правильно налаштувати Django додаток для асинхронної роботи у виробничому середовищі.

Перш за все, варто розібратися з міфом про те, що Python є "повільною" мовою для бекенд-розробки. Швидкість виконання Python справді трохи нижча порівняно з такими мовами, як Java чи C++, але реальними "вузькими місцями" для продуктивності є операції введення/виведення — зчитування з бази даних, запити по мережі та операції з дисками. Якщо поглянути на реальні приклади, Python не виглядає так вже й повільним, коли це порівняти з іншими мовами, особливо якщо прибрати операції, що залежать від I/O.

Однак, найбільшу вигоду можна отримати, якщо замість того, щоб чекати відповіді від бази даних, додаток зможе обробляти наступні запити. Це дозволить нам максимізувати продуктивність завдяки асинхронним API.

Для цього важливо зрозуміти, як працює Global Interpreter Lock (GIL) і як asyncio може використовувати цикл подій (event loop) для покращення ефективності I/O операцій. Замість того, щоб блокувати основний потік, asyncio дозволяє виконувати інші завдання під час очікування відповіді від I/O операцій.

Далі йдемо до самого створення асинхронного представлення у Django. Щоб створити асинхронне представлення, достатньо додати кілька простих змін у код: замінити стандартну функцію представлення на асинхронну, використовувати асинхронні методи для роботи з базою даних, а також змінити синхронний сон (time.sleep) на неблокуючий (asyncio.sleep).

Крім цього, для роботи асинхронного представлення потрібен ASGI (Asynchronous Server Gateway Interface) замість стандартного WSGI (Web Server Gateway Interface). Завдяки ASGI можна обробляти запити одночасно на головному потоці, що дозволяє обробляти кілька запитів одночасно без необхідності створювати нові потоки для кожного запиту.

У статті також наводяться приклади коду для створення асинхронних представлень у Django. Запуск додатку за допомогою Gunicorn та ASGI показує, як правильно налаштувати сервер для асинхронних API. Після налаштування логів і запуску скрипта для надсилання запитів можна спостерігати, як Django обробляє кілька запитів одночасно, зменшуючи час очікування.

Різниця між синхронними та асинхронними представленнями стає очевидною, коли мова йде про масштабування. В асинхронному представленні всі запити обробляються основним потоком, а нові запити обробляються, коли потік вільний, що дозволяє більш ефективно використовувати ресурси сервера та масштабувати додаток під великий обсяг трафіку. Водночас у випадку синхронних представлень для кожного запиту потрібно створювати окремі потоки, що негативно впливає на продуктивність при великій кількості одночасних запитів.

Отже, асинхронні представлення дозволяють досягти кращої ефективності та масштабованості додатка, що робить їх важливим інструментом для роботи з високим навантаженням.

В підсумку ми отримуємо чітке розуміння того, як асинхронні API використовують ресурси сервера набагато ефективніше, а також як їх правильно налаштувати та використовувати для досягнення високої продуктивності в Django.

Перекладено з: Django Sync vs Async Views