Async equivalents của context managers và generators cho async code:
python
from contextlib import asynccontextmanager
# Async context manager với @asynccontextmanager
@asynccontextmanager
async def managed_connection(pool):
conn = await pool.acquire()
try:
yield conn
finally:
await pool.release(conn)
async with managed_connection(pool) as conn:
await conn.execute(query)
# Class-based async context manager
class AsyncDBSession:
async def __aenter__(self):
self.session = await create_session()
return self.session
async def __aexit__(self, exc_type, exc_val, exc_tb):
if exc_type:
await self.session.rollback()
else:
await self.session.commit()
await self.session.close()
# Async generator
async def fetch_pages(url: str):
page = 1
while True:
data = await httpx.get(f"{url}?page={page}")
if not data: break
yield data
page += 1
async for page_data in fetch_pages("https://api.example.com/users"):
process(page_data)