Verwenden des Async-Generators mit Async/Await zur Verwaltung des DatenbankverbindungslebenszyklusPython

Python-Programme
Anonymous
 Verwenden des Async-Generators mit Async/Await zur Verwaltung des Datenbankverbindungslebenszyklus

Post by Anonymous »

Ich arbeite mit Python Asyncio und einem asynchronen Datenbanktreiber und möchte das Öffnen und Schließen einer Datenbankverbindung mithilfe eines Asynchrongenerators verwalten.
Die Idee besteht darin, eine Live-Verbindung zum Anrufer herzustellen, sicherzustellen, dass sie mit async/await verwendet werden kann, und eine Bereinigung (Verbindung schließen) zu garantieren, sobald der Anrufer fertig ist.
Ein vereinfachtes Beispiel für das, was ich versuche:

Code: Select all

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()
Und Verwendung:

Code: Select all

async for conn in get_db_connection():
await conn.execute("INSERT INTO users VALUES ($1)", "Alice")
Dieses Muster funktioniert, aber ich habe ein paar Fragen:
  • Ist die Verwendung eines asynchronen Generators wie dieses ein empfohlenes Muster für die Verwaltung von Datenbankverbindungslebenszyklen?
  • Gibt es versteckte Fallstricke in Bezug auf Fehlerbehandlung, Abbruch oder Verbindungslecks?
  • Ist dieser Ansatz besser oder schlechter als die Verwendung eines @asynccontextmanager aus contextlib?
  • Wie lässt sich dieser skalieren, wenn er mit Verbindungspools anstelle einer einzelnen Verbindung verwendet wird?
Ich interessiere mich speziell für Best Practices, nicht nur dafür, ob der Code ausgeführt wird.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post