Перейти к содержанию

Практикум: кто управляет сессией

Нужен работающий Docker. Скрипт создаёт и удаляет собственный контейнер PostgreSQL 17. Выполните команду из docs/blog/lab/2026-09-07-stop-passing-asyncsession-everywhere в клоне репозитория. Соседний каталог 2026-09-07-unit-of-work-sqlalchemy-2 тоже нужен: оттуда берутся модели, функции статьи и закреплённые зависимости.

uv run --no-project --python 3.13 --with-requirements requirements.txt sessions_lab.py

Скрипт выводит версию PostgreSQL (17.11 в проверенном запуске). Он проверяет, что создание сессии оставляет пул свободным, первый запрос занимает соединение, а закрытие сессии возвращает его.

Вместо HTTP API доставки используется управляемое асинхронное ожидание. Два запроса ждут внутри транзакций и занимают пул из двух соединений; третий получает таймаут пула. Перенос того же ожидания до транзакции оставляет соединения свободными. Проверяются занятые соединения и сохранённые заказы с событиями; HTTP-сервера и измерения пропускной способности здесь нет.

Скрипт также показывает результат двух одновременных запросов через одну сессию. Неподдерживаемое использование может пройти без ошибки в отдельном запуске, поэтому конкретное исключение не требуется. До освобождения ресурсов обе задачи дожидаются завершения. Правильный вариант использует функцию с TaskGroup из order_flow.py: шесть независимых заказов должны получить шесть разных сессий, сохранить шесть пар из заказа и события и вернуть все соединения.

Успешный запуск завершается строкой PASS: session and pool scenarios.

Исходный код практикума на GitHub.