More Context Manager Patterns
Async context managers, nested contexts, and advanced patterns.
Overview
Master advanced context manager patterns.
Async Context Managers
import asyncio
from contextlib import asynccontextmanager
@asynccontextmanager
async def async_resource(name):
print(f"Acquiring {name}")
await asyncio.sleep(0.1)
resource = {"name": name, "active": True}
try:
yield resource
finally:
print(f"Releasing {name}")
async def main():
async with async_resource("database") as db:
print(f"Using {db}")
asyncio.run(main())
ExitStack
from contextlib import ExitStack
def process_files(filenames):
with ExitStack() as stack:
files = [
stack.enter_context(open(fn, 'r'))
for fn in filenames
]
for f in files:
print(f.read())
Practice
Implement an async context manager for a connection pool.