티스토리 뷰

프로그래밍/python

fastapi lifespan, context manager

수박수박좋다 2025. 6. 9. 18:30
반응형

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}")
반응형

'프로그래밍 > python' 카테고리의 다른 글

fastapi 1  (0) 2025.03.12
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
농담곰의 고군분투 개발기