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

Đ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ề…

PythonNâng cao35 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ủ đề

asynciosemaphoreconcurrencyrate limiting

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.

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.