Chia việc bằng Queue cho nhiều luồng có khoá
queue.Queue là cấu trúc an toàn với nhiều luồng: mỗi lần get_nowait() chỉ một luồng
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: python-basics, python-functions.
Nội dung đề bài
Mô tả bài toán
queue.Queue là cấu trúc an toàn với nhiều luồng: mỗi lần get_nowait() chỉ một luồng nhận được một phần tử nên không phần tử nào bị xử lý hai lần. Danh sách kết quả thì chưa an toàn, nên mọi lần ghi vào đó phải nằm trong threading.Lock. Kết quả cuối cùng được sắp xếp để không phụ thuộc thứ tự hoàn thành của các luồng.
Yêu cầu
Viết hàm consume_queue(items, worker_count=2):
- Ném ValueError nếu items rỗng hoặc worker_count nhỏ hơn 1.
- Đưa toàn bộ items vào một queue.Queue, rồi tạo worker_count luồng chạy cùng một
hàm xử lý.
- Mỗi luồng lặp: lấy một phần tử bằng get_nowait(); gặp queue.Empty thì kết thúc;
với mỗi phần tử lấy được, nhân nó với 10 rồi ghi vào danh sách chung bên trong vùng có khoá.
- Chờ mọi luồng kết thúc bằng join() rồi trả về danh sách kết quả đã sắp xếp tăng dần.
Quy ước nộp bài
Nộp hàm consume_queue trong solution.py. Hệ thống gọi hàm trực tiếp theo tên đối số và so danh sách trả về với kết quả soạn tay; không đọc dữ liệu từ stdin và không in ra stdout.
Input
- items: danh sách từ 1 đến 20 số nguyên.
- worker_count: số luồng, từ 1 đến 4.
Output
Danh sách số nguyên đã sắp xếp tăng dần, gồm đúng một phần tử item * 10 cho mỗi phần tử của items.
Ràng buộc
- Mỗi phần tử phải được xử lý đúng một lần: mỗi luồng phải lặp cho tới khi hàng đợi cạn.
- Mọi lần ghi vào danh sách chung phải nằm trong khoá.
- Trả về danh sách đã sắp xếp, không phụ thuộc luồng nào chạy xong trước.
- Không dùng sleep và không đo thời gian chạy.
Ví dụ 1
Input
consume_queue(items=[1, 2, 3], worker_count=2)
Output
[10, 20, 30]
Ví dụ 2
Input
consume_queue(items=[4], worker_count=1)
Output
[40]
Giải thích
Với items = [1, 2, 3] và worker_count = 2, hai luồng chia nhau ba phần tử; giả sử luồng thứ nhất xử lý 2 và 3 còn luồng thứ hai xử lý 1 thì danh sách chung là [20, 30, 10], và sau khi sắp xếp hàm trả về [10, 20, 30].
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.
