Почему len() не реализовано для очередей?

Встроенная функция len() (https://docs.python.org/3/library/functions.html#len) возвращает "длину (количество элементов) объекта", но это не реализовано для queue.Queue (https://docs.python.org/3/library/queue.html). Вместо этого queue.Queue имеет метод qsize(), который возвращает приблизительный размер очереди, когда он явно имеет длину; вы можете указать максимальную длину Queue в конструкторе. Аналогичный collections.deque работает с len.

В чем причина не использования общей len() для queue.Queue? Или: Каковы были бы проблемы, если вместо qsize были названы __len__, чтобы включить функцию len()?

Ответ 1

len() не применяется для queue.Queue, потому что это было бы "привлекательной неприятностью": что-то, что только эксперт должен даже рассмотреть, но "дружественное имя" побудило бы не экспертов использовать его.

В отличие от большинства типов последовательностей (например, list и deque), queue.Queue специально предназначен для использования в многопоточных контекстах (и аналогично для типа очереди multiprocessing). Хотя количество элементов в Queue, безусловно, имеет определенное значение в любой конкретный момент времени, невозможно, чтобы код пользователя узнал, что это за значение: между тем, как возвращается вызов .qsize(), и ваш код может смотреть на возвращаемое значение, любое количество других потоков (или процессов в случае multiprocessing) могло внести любое количество изменений в содержимое очереди.

Итак, единственное, что можно сказать о значении, возвращаемом .qsize(), это то, что в Queue было много значений в нем в некоторый момент в прошлом. К тому моменту, когда вы можете использовать возвращаемое значение, оно может иметь в нем сколько угодно (или меньше) значений.

Конечно, это не так, если вы используете только один поток, но тогда нет необходимости платить за сложность реализации Queue (вместо этого используйте list или deque).