PHpullh
학습 라이브러리/Python/재시도 패턴 (tenacity)

PYTHON · 예외처리

재시도 패턴 (tenacity)

실패할 수 있는 작업에 재시도 로직을 적용하는 패턴입니다. 지수 백오프와 조건부 재시도를 다룹니다.

예외처리고급retry재시도tenacitybackoff

핵심 설명

실패할 수 있는 작업에 재시도 로직을 적용하는 패턴입니다. 지수 백오프와 조건부 재시도를 다룹니다.

Python code

import time
import random
from functools import wraps

def retry(max_attempts=3, delay=1.0, backoff=2.0, exceptions=(Exception,)):
    """재시도 데코레이터 (지수 백오프)"""
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            current_delay = delay
            for attempt in range(1, max_attempts + 1):
                try:
                    return func(*args, **kwargs)
                except exceptions as e:
                    if attempt == max_attempts:
                        raise
                    print(f"  시도 {attempt} 실패: {e}, "
                          f"{current_delay:.1f}초 후 재시도")
                    time.sleep(current_delay * 0.01)  # 데모용 축소
                    current_delay *= backoff
        return wrapper
    return decorator

@retry(max_attempts=5, delay=0.5, backoff=2.0,
       exceptions=(ConnectionError,))
def unreliable_api():
    if random.random() < 0.6:
        raise ConnectionError("서버 응답 없음")
    return {"status": "success", "data": [1, 2, 3]}

# 실행
try:
    result = unreliable_api()
    print(f"성공: {result}")
except ConnectionError:
    print("최종 실패")

# tenacity 라이브러리 패턴
# from tenacity import retry, stop_after_attempt, wait_exponential
# @retry(stop=stop_after_attempt(3),
#        wait=wait_exponential(multiplier=1, max=10))
# def call_api(): ...

학습 팁

실제 프로젝트에서는 pip install tenacity를 사용하세요. 조건부 재시도, 콜백, 통계 등 풍부한 기능을 제공합니다.

주의할 점

모든 예외에 재시도하면 프로그래밍 오류(TypeError, ValueError)까지 재시도합니다. 네트워크 에러 등 일시적 오류만 지정하세요.

자주 묻는 질문

재시도 패턴 (tenacity)란 무엇인가요?

실패할 수 있는 작업에 재시도 로직을 적용하는 패턴입니다. 지수 백오프와 조건부 재시도를 다룹니다.

재시도 패턴 (tenacity) 학습 시 주의할 점은 무엇인가요?

모든 예외에 재시도하면 프로그래밍 오류(TypeError, ValueError)까지 재시도합니다. 네트워크 에러 등 일시적 오류만 지정하세요.

Continue Learning

Python 학습을 이어가세요

총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.