Использование асинхронного генератора с async/await для управления жизненным циклом подключения к базе данных.Python

Программы на Python
Ответить
Anonymous
 Использование асинхронного генератора с async/await для управления жизненным циклом подключения к базе данных.

Сообщение Anonymous »

Я работаю с Python asyncio и асинхронным драйвером базы данных, и я хочу управлять открытием и закрытием соединения с базой данных с помощью асинхронного генератора.
Идея состоит в том, чтобы создать живое соединение с вызывающей стороной, убедиться, что его можно использовать с async/await, и гарантировать очистку (закрыть соединение) после завершения вызывающей стороны.
Упрощенный пример того, что я пытаюсь сделать:

Код: Выделить всё

from typing import AsyncGenerator
import asyncpg

async def get_db_connection() -> AsyncGenerator[asyncpg.Connection, None]:
conn = await asyncpg.connect(dsn="postgresql://user:pass@localhost/db")
try:
yield conn
finally:
await conn.close()
И использование:

Код: Выделить всё

async for conn in get_db_connection():
await conn.execute("INSERT INTO users VALUES ($1)", "Alice")
Этот шаблон работает, но у меня есть несколько вопросов:
  • Рекомендуется ли использование асинхронного генератора, подобного этому, для управления жизненными циклами соединений с базой данных?
  • Есть ли какие-либо скрытые подводные камни, связанные с обработкой ошибок, отменой или утечками соединений?
  • Этот подход лучше или хуже, чем использование @asynccontextmanager из contextlib?
  • Как этот подход масштабируется при использовании с пулами соединений вместо одного соединения?
Меня особенно интересуют лучшие практики, а не только то, работает ли код.

Подробнее здесь: https://stackoverflow.com/questions/798 ... -lifecycle
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»