2017-12-01 45 views
10

Chức năng tích hợp len() (https://docs.python.org/3/library/functions.html#len) trả về "độ dài (số mục) của một đối tượng", nhưng điều này không được triển khai cho queue.Queue (https://docs.python.org/3/library/queue.html). Thay vào đó, queue.Queue có phương thức qsize() trả về kích thước gần đúng của hàng đợi, khi nó rõ ràng có độ dài; bạn có thể chỉ định độ dài tối đa của một Queue trong hàm tạo. Tương tự collections.deque không hoạt động với len.Tại sao len() không được triển khai cho Hàng đợi?

Lý do không sử dụng phổ biến len() cho queue.Queue là gì? Hoặc: Điều gì sẽ là vấn đề nếu thay vào đó, qsize được đặt tên __len__ để bật chức năng len()?

+2

Có thể vì mọi người mong đợi 'len' trả lại giá trị chính xác, không phải là giá trị gần đúng. Và nó phải nhanh. Để thực hiện một '__len__' chính xác, Hàng đợi sẽ phải bị khóa tạm thời để ngăn việc bổ sung và xóa bỏ, điều này sẽ ảnh hưởng đến hiệu suất. –

Trả lời

10

len() không được triển khai cho queue.Queue vì nó sẽ là một "phiền toái hấp dẫn": điều mà chỉ một chuyên gia nên cân nhắc sử dụng, nhưng "tên thân thiện" sẽ khuyến khích các chuyên gia không sử dụng nó.

Không giống như hầu hết các loại chuỗi (như listdeque), một queue.Queue là đặc biệt dành được sử dụng trong bối cảnh đa luồng (và tương tự đối với loại hàng đợi multiprocessing mô-đun của). Mặc dù số lượng mục trong một số Queue chắc chắn có giá trị xác định tại bất kỳ thời điểm cụ thể nào, không thể cho mã người dùng tìm ra giá trị đó là gì: giữa thời gian gọi tới số .qsize() và mã của bạn có thể xem với giá trị trả về , bất kỳ số lượng các chủ đề khác (hoặc quy trình, trong trường hợp multiprocessing) có thể đã thực hiện bất kỳ số thay đổi nào đối với nội dung của hàng đợi.

Vì vậy, điều thật duy nhất mà có thể nói về giá trị trả về bởi .qsize()Queue rằng nhiều giá trị trong nó ở một số thời gian trong quá khứ. Vào thời điểm bạn có thể sử dụng giá trị trả về, nó có thể có nhiều giá trị (hoặc ít hơn) tùy ý trong nó.

Tất nhiên là không phải vậy nếu bạn chỉ chạy một luồng - nhưng sau đó không cần phải trả tiền cho sự phức tạp thực hiện của Queue (sử dụng số list hoặc deque thay thế).

+0

vậy tại sao 'empty()' và 'full()' được thực hiện cho một hàng đợi? –

+5

Họ sẽ không thực hiện 'empty()' và 'full()' nếu tôi đã viết chúng ;-) Trong những ngày đầu, các tham số 'timeout =' tùy chọn khác nhau không tồn tại, và 'full()' và 'empty()' được sử dụng trong các vòng lặp như _probabilistic_ mánh lới quảng cáo để thực hiện một dự đoán phong nha về việc liệu '.put()' hay '.get()' có "có khả năng" thành công hay không. Mã sử ​​dụng chúng (như mã sử dụng 'qsize()') thường không dễ bị lỗi thời gian. –

Các vấn đề liên quan