Результат queue.qsize()
является точным.Неточность заключается в том, как пользователи часто его используют.
Поскольку Queue
распределяется одновременно между различными потоками / процессами, когда процесс A проверяет свой размер, процесс B может чередовать его выполнение и изменять его.Это может привести к проблемам логики.
Рассмотрим следующий пример:
queue.put("something")
def process_a(queue):
"""Does something if queue has at least one element."""
if queue.qize() > 0:
# now, Process B takes over and steals the only element in the queue
element = queue.get() # UNEXPECTED: process A will block here
do_something(element)
def process_b(queue):
"""Gets an element from the queue."""
queue.get()
a = Process(process_a, args=(queue,))
b = Process(process_b, args=(queue,))
a.start()
b.start()
Проблема здесь в том, что логика полагается на определенное состояние очереди и воздействует на него.Тем не менее, состояние очереди может измениться в любой момент в параллельном сценарии.Следовательно, логика выше не будет работать, как ожидалось.
Для вашего конкретного случая использования это не должно быть проблемой, так как вы выполняете мониторинг состояния очереди в определенный момент времени.Поэтому вам все равно, будет ли очередь иметь другой размер спустя одну миллисекунду.Что вас волнует, так это средняя пропускная способность очереди.