Еще Раз О Производительности Python-Фреймворков Для Веб-Разработки

Недавно мне пришлось запустить проект нового веб-сервиса, и я решил протестировать максимальную нагрузочную способность Django, а заодно сравнить его с Flask и AIOHTTP. Результат мне показался неожиданным, поэтому «просто оставлю» его здесь.

На диаграммах ниже показаны результаты простейшего Тест Apache для фреймворков Джанго версия 3.1, Колба 1.1 и АИОНТП 3.7. AIOHTTP работает в «стандартном» однопоточном асинхронном режиме, Django и Flask обслуживаются синхронным WSGI-сервером.

Единорог с количеством потоков, равным количеству доступных ядер процессора * 2. ASGI в тесте не участвовал.

Условия испытаний Во всех трех случаях отображается простая страница списка по результатам выборки из реляционной базы данных.

PostgreSQL .

Я постарался сделать запрос максимально приближенным к реальности:

   

SELECT r.id, r.auth_user_id, r.status, r.updated, r.label, r.content, u.username, ARRAY_AGG(t.tag) tag, COUNT(*) OVER() cnt, ( SELECT COUNT(*) FROM record r2 WHERE r2.parent_id IS NOT NULL AND r2.parent_id = r.id AND r2.status = 'new' ) AS parts FROM record r JOIN auth_user u ON u.id = r.auth_user_id LEFT JOIN tag t ON t.kind_id = r.id AND t.kind = 'rec' WHERE r.parent_id IS NULL AND r.status = 'new' GROUP BY r.id, u.username ORDER BY r.updated DESC LIMIT 10 OFFSET 0

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

AIOHTTP использует пул подключений к базе данных и драйвер asyncpg, Django и Flask — SQLAlchemy без ORM (для чистоты эксперимента) и psycopg2. Приложение Django создано по стандартам используя структуру (django-admin startproject, Manage.py startapp и т. д.), вывод тестовой страницы через Посмотреть список .

Установки Flask и AIOHTTP построены на основе канонических веб-приложений «Hello, world», взятых из документации.

Результаты запуска теста на локальной машине (4 ядра ЦП):

Еще раз о производительности Python-фреймворков для веб-разработки

UPD: как справедливо пишут в комментариях, для честного сравнения надо либо запускать AIOHTTP за Gunicorn, либо уменьшать количество воркеров до 1. Тот же тест на реальном однопроцессорном VDS (пинг около 45 мс):

Еще раз о производительности Python-фреймворков для веб-разработки

Во время теста AIOHTTP использовал 100% одного ядра ЦП, Flask и Django использовали 100% всех доступных ядер.



выводы

На самом деле сравнивать асинхронные и многопоточные приложения не совсем корректно — они решают разные задачи.

Поэтому результат выглядит вполне логичным: в локальном тесте у AIOHTTP просто было меньше ресурсов; при равных условиях производительность выровнялась.

Но скромный результат Flask трудно объяснить; Мне не удалось «разогнать» этот фреймворк.

Теги: #python #Разработка веб-сайтов #Высокая производительность #flask #django #aiohttp

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.