python-084Đọc toàn bộ đề miễn phí
Mô hình Producer-Consumer bất đồng bộ với asyncio.Queue và Sentinel Shutdown
Viết hàm coroutine bất đồng bộ:
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: asyncio, coroutines.
Nội dung đề bài
Mục tiêu kiến thức
- Triển khai mô hình đa tiến trình con bất đồng bộ (Async Producer-Consumer Architecture).
- Sử dụng
asyncio.Queuecó giới hạn kích thước (bounded queue) để điều tiết lưu lượng (Backpressure). - Sử dụng tín hiệu kết thúc (Sentinel Token
None) để dừng workers một cách có trật tự (Graceful Shutdown).
Mô tả bài toán
Viết hàm coroutine bất đồng bộ: run_async_pipeline(items: list[dict], num_workers: int, transform_delay: float = 0.01) -> list[dict]:
items: Danh sách các dictionary chứa{"id": int, "value": int}.- Thiết lập một
asyncio.Queue(maxsize=max(num_workers * 2, 10)). - Producer coroutine:
- Đẩy từng item trong
itemsvào queue. - Sau khi đẩy hết, đẩy
num_workersgiá trịNone(sentinel tokens) vào queue để báo hiệu cho từng worker dừng lại. - Worker coroutine:
- Liên tục lấy
itemtừ queue bằngawait queue.get(). - Nếu
item is None, gọiqueue.task_done()rồi thoát vòng lặp. - Nếu có dữ liệu:
- Giả lập độ trễ:
await asyncio.sleep(transform_delay). - Tính toán: tạo dict mới
{"id": item["id"], "transformed": item["value"] ** 2, "worker_id": worker_id}. - Lưu kết quả vào danh sách kết quả chung.
- Gọi
queue.task_done(). - Thu thập toàn bộ kết quả, sắp xếp lại theo
idtăng dần và trả về.
Nếu num_workers <= 0, raise ValueError("num_workers phai lon hon 0").
Input
- Tham số:
items: list[dict],num_workers: int,transform_delay: float.
Output
- Trả về:
list[dict]đã sắp xếp theoid.
Ràng buộc
- Thời gian chạy tối đa: 2000ms.
- Giới hạn bộ nhớ: 256MB.
- Dữ liệu đầu vào tuân thủ đúng kiểu dữ liệu và miền giá trị được mô tả.
Ví dụ 1
Input
run_async_pipeline([{'id': 1, 'value': 2}, {'id': 2, 'value': 3}, {'id': 3, 'value': 4}], 2, 0.001)Output
[{'id': 1, 'transformed': 4}, {'id': 2, 'transformed': 9}, {'id': 3, 'transformed': 16}]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.
Ví dụ 2
Input
run_async_pipeline([], 2, 0.001)Output
[]Giải thích
Hàm được gọi với bộ tham số thứ hai và trả về kết quả tương ứng theo thiết kế.
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.
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.
