Python
Context Variables & 의존성 주입
의존성 주입 패턴과 contextvars 로 스레드/코루틴 안전한 컨텍스트를 관리합니다.
from contextvars import ContextVar
from typing import Optional
import asyncio
# ContextVar — 코루틴/스레드마다 독립적인 값
current_user: ContextVar[Optional[str]] = ContextVar(
"current_user", default=None
)
request_id: ContextVar[str] = ContextVar("request_id")
async def handle_request(user: str, req_id: str):
current_user.set(user)
request_id.set(req_id)
await process()
async def process():
user = current_user.get()
rid = request_id.get()
print(f"[{rid}] {user} 처리 중")
await asyncio.sleep(0.01)
# 의존성 주입 — 간단한 컨테이너
class Container:
_services = {}
@classmethod
def register(cls, name: str, factory):
cls._services[name] = factory
@classmethod
def resolve(cls, name: str):
return cls._services[name]()
# 등록
Container.register("db", lambda: {"connected": True})
Container.register("cache", lambda: {})
# 사용
db = Container.resolve("db")
cache = Container.resolve("cache")
async def main():
await asyncio.gather(
handle_request("Alice", "req-001"),
handle_request("Bob", "req-002"),
)
asyncio.run(main())