티스토리 뷰
반응형
lifespan
- app 시작- 종료될 때 특정 함수를 호출하는 이벤트 핸들링을 처리한다.
- yield를 반드시 사용해야함
- yield 앞에 오는 코드가 시작될 떄 호출, 뒤는 종료직전 호출되는 함수.
- 전체 앱에서 사용하는 자원 설정, 정리, db connection pool, ml model load시 사용
asynccontextmanager
으로 데코레이터 사용되는데 함수를 비동기 컨텍스트 매니저라는 것으로 변환시킴.
컨텍스트 매니저
- 원하는 타이밍에 리소스 할당, 제공하는 역할
with
문과 함께 사용됨- 코드블록이 실행되기 전에 정의된 초기화 작업 수행 → 완료 후 정리 작업 수행
- (
__enter__()
- with문이 시작 될 때,__exit__()
- with의 코드블럭 실행 후 실행 )를 구현함으로써 가능해진다. - 이를 magic methods라고 부르는데,
__init__
과 같이 예약된 이름으로 특정 기능을 하도록 정의된 메소드를 뜻함
- (
- fs, db연결, 시스템리소스(쓰레드, 프로세스 등)의 리소스 할당 해제를 간단, 안전하게 만들어줌
- 클래스로 정의하거나 데코레이터를 사용할 수 있음
Async context manager
- 비동기 컨텍스트 매니저
@asynccontextmanager
의 데코레이터 형태로도 제공__aenter__()
,__aexit()__
로 클래스형태로 구현할 땐 메소드를 구현해도 됨
예제코드
class DatabaseConnection:
def __init__(self, db_name):
self.db_name = db_name
self.connection = None
def __enter__(self):
print(f"Connecting to database {self.db_name}")
# 실제 구현에서는 여기서 데이터베이스 연결을 수행
self.connection = f"Connection to {self.db_name}"
return self.connection
def __exit__(self, exc_type, exc_val, exc_tb):
print(f"Closing connection to {self.db_name}")
self.connection = None
# 데이터베이스 연결 예제
def database_example():
with DatabaseConnection("my_database") as db:
print("Using database:", db)
# 데이터베이스 작업 수행
# 데코레이터 예제
@contextmanager
def database_connection(db_name):
print(f"Connecting to database {db_name}")
connection = f"Connection to {db_name}"
try:
yield connection
finally:
print(f"Closing connection to {db_name}")
반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
농담곰의 고군분투 개발기