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…
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ủ đề
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 < 0hoặcinitial_delay < 0hoặcbackoff_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ếusleep_funcđược cung cấp (nếusleep_func is None, dùngtime.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_exceptionshoặ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.
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.
Góp ý & báo lỗi bài tập
Đề bài chưa rõ, test có vấn đề hay bạn có ý tưởng giúp bài tốt hơn? Gửi cho đội ngũ AI Empire nhé — mỗi góp ý đều được đọc.
