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

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

PythonCơ bản15 phút

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ủ đề

concurrencythreadingqueuelockentry-ramp

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].

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.

Nhóm Zalo