Điều phối Tác vụ Bất đồng bộ với Giới hạn Concurrency bằng Semaphore
Hệ thống AI Empire Academy cần gửi đồng loạt 1000 truy vấn trích xuất đặc trưng văn bản tới cụm máy chủ AI. Nếu khởi chạy cùng lúc tất cả các coroutine, máy chủ mục tiêu sẽ trả về
Tiến độ của tôi ở bài này
Điểm và code bạn nộp đượ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: async await, coroutines, asyncio gather, asyncio semaphore.
Nội dung đề bài
Mục tiêu kiến thức
- Sử dụng asyncio.Semaphore để giới hạn số lượng tác vụ I/O chạy song song (Concurrency Throttling).
- Phối hợp asyncio.gather để thu thập toàn bộ kết quả mà vẫn bảo toàn nguyên vẹn thứ tự ban đầu.
- Ngăn chặn lỗi cạn kiệt kết nối mạng (Socket Exhaustion) hoặc bị chặn IP (Rate Limit Exceeded) khi gọi API ngoài.
Mô tả bài toán
Hệ thống AI Empire Academy cần gửi đồng loạt 1000 truy vấn trích xuất đặc trưng văn bản tới cụm máy chủ AI. Nếu khởi chạy cùng lúc tất cả các coroutine, máy chủ mục tiêu sẽ trả về mã lỗi 429 Too Many Requests.
Hãy viết hàm bất đồng bộ: async def bounded_gather(coro_factories: list[Callable[[], Coroutine]], max_concurrency: int) -> list[Any]
Quy tắc hoạt động:
- Kiểm tra tham số: Nếu max_concurrency <= 0, ném ngoại lệ ValueError("max_concurrency phai lon hon 0").
- Khởi tạo và điều phối:
- Mỗi phần tử trong coro_factories là một hàm không có tham số, khi gọi sẽ sinh ra một coroutine (ví dụ: lambda: fetch_result(i)).
- Sử dụng asyncio.Semaphore(max_concurrency) để giới hạn: tại bất kỳ thời điểm nào, số lượng coroutine đang thực thi trong khối semaphore không bao giờ vượt quá max_concurrency.
- Kết quả:
- Sử dụng asyncio.gather để chờ toàn bộ tác vụ hoàn thành.
- Danh sách trả về phải chứa kết quả theo đúng thứ tự tương ứng với coro_factories ban đầu, bất kể tác vụ nào hoàn thành trước hay sau.
- Xử lý ngoại lệ: Nếu một tác vụ bất đồng bộ ném ra ngoại lệ, ngoại lệ đó phải được lan truyền ra ngoài theo hành vi mặc định của asyncio.gather.
Input
- Các tham số truyền vào hàm/lớp bounded_gather hoặc dữ liệu đầu vào theo định dạng mô tả.
Output
- Kết quả trả về của hàm/lớp bounded_gather hoặc dữ liệu in ra màn hình theo đúng đặc tả.
Ràng buộc
- 1 ≤ len(coro_factories) ≤ 1000.
- 1 ≤ max_concurrency ≤ 100.
- Thời gian chạy tối đa: 1500ms.
- Giới hạn bộ nhớ: 256MB.
Ví dụ 1
Input
bounded_gather(task_count=6, max_concurrency=2)
Output
[0, 1, 2, 3, 4, 5]
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.
