python-027Đọc toàn bộ đề miễn phí

Decorator Tự động Thử lại với Chiến lược Exponential Backoff

Khi giao tiếp với các nhà cung cấp mô hình LLM (như Gemini, Grok) hoặc dịch vụ thanh toán, các lỗi mạng tạm thời (transient network failures) như ConnectionError hoặc TimeoutError…

PythonTrung bình30 phút

Tiến độ của tôi ở bài này

Điểm được lưu vào tài khoản sau khi chấm bài.

Đang tải điểm của bạn…

Kiến thức và chủ đề

decoratorsfunctoolsclosureserror handling

Kiến thức tiên quyết: decorator syntax, functools wraps, args kwargs, exception handling.

Nội dung đề bài

Mục tiêu kiến thức

  • Nắm vững cú pháp và cơ chế hoạt động của Decorator bậc cao nhận tham số.
  • Sử dụng @functools.wraps để bảo toàn metadata của hàm gốc (__name__, __doc__, __annotations__).
  • Cài đặt chiến lược tăng thời gian chờ cấp số nhân (Exponential Backoff) trong hệ thống gọi API mạng.

Mô tả bài toán

Khi giao tiếp với các nhà cung cấp mô hình LLM (như Gemini, Grok) hoặc dịch vụ thanh toán, các lỗi mạng tạm thời (transient network failures) như ConnectionError hoặc TimeoutError thường xuyên xảy ra.

Hãy xây dựng decorator: retry_with_backoff(max_retries: int = 3, initial_delay: float = 0.1, backoff_factor: float = 2.0, retryable_exceptions: tuple[type[Exception], ...] = (Exception,), sleep_func: callable = None)

Quy tắc hoạt động:

  • Bảo toàn thông tin: Hàm được bọc (wrapper) phải bảo toàn __name__, __doc__, __annotations__ của hàm gốc bằng @functools.wraps.
  • Kiểm tra tham số: Nếu max_retries < 0 hoặc initial_delay < 0 hoặc backoff_factor < 1.0, ném ngoại lệ ValueError.
  • Thực thi và thử lại:
  • Gọi hàm gốc. Nếu thành công, trả về kết quả ngay lập tức.
  • Nếu gặp ngoại lệ exc:
  • Kiểm tra nếu isinstance(exc, retryable_exceptions) và số lần retry còn lại > 0:
  • Gọi sleep_func(current_delay) nếu sleep_func được cung cấp (nếu sleep_func is None, dùng time.sleep(current_delay)).
  • Cập nhật thời gian chờ: current_delay *= backoff_factor.
  • Giảm số lần retry và thực hiện lại lần gọi tiếp theo.
  • Nếu ngoại lệ không thuộc retryable_exceptions hoặc số lần thử lại đã hết (retries == 0), re-raise chính ngoại lệ đó ra ngoài.

Input

  • Các tham số cấu hình của decorator và hàm mục tiêu cần trang trí.

Output

Kết quả trả về của hàm gốc hoặc ngoại lệ được ném ra đúng theo quy tắc trên.

Ràng buộc

  • Thời gian chạy tối đa: 1000ms.
  • Giới hạn bộ nhớ: 256MB.

Ví dụ 1

Input

retry_with_backoff(call_flow='success_after_2_failures', max_retries=3, initial_delay=0.01, backoff_factor=2.0, retryable_exceptions=['ConnectionError'])

Output

'success'

Giải thích

Hàm được gọi với các tham số mẫu trên và trả về kết quả chính xác theo yêu cầu.

3 cấp độ gợi ýMở dần khi bạn thật sự cần hỗ trợ.
Phân tích lời giảiGiải thích hướng tư duy và thuật toán.
Code tham khảoDùng để đối chiếu sau khi tự làm.

Gợi ý và lời giải chỉ mở sau khi bạn bấm Nộp bài. Giáo viên và quản trị viên mở được ngay.