Функция многопроцессорной очереди empty() не работает надежно в python

#python-3.x

Вопрос:

У меня есть многопроцессорная программа, в которой один процесс помещает множество элементов в очередь, а затем устанавливает событие после того, как он закончил помещать элементы в очередь. Другой процесс ожидает этого события, а затем опустошает очередь в цикле while, как в приведенном ниже коде, проверяя с помощью вызова empty (). Проблема в том, что время от времени (возможно, 1 раз из 10) функция empty() возвращает значение True, когда в очереди все еще есть элементы. Во время цикла while ни один другой процесс или поток не касается очереди. Проблема может быть воспроизведена с помощью приведенного ниже кода в одном процессе. Большую часть времени выход составляет:

 The size of my_queue initially is 400
The size of my_queue is 0
 

Но время от времени я буду получать что-то вроде:

 The size of my_queue initially is 400
The size of my_queue is 377
 

Вот код:

 from multiprocessing import Queue as MPQueue

my_list = []
my_queue = MPQueue()
for i in range(0, 400):
    my_queue.put(f"The value of i is {i}")

print(f"The size of my_queue initially is {my_queue.qsize()}")
while not my_queue.empty():
    my_list.append(my_queue.get())
print(f"The size of my_queue is {my_queue.qsize()}")
 

Является ли это ошибкой в многопроцессорной обработке.Модуль очереди или я что-то упускаю? Я также попытался использовать get_nowait (), а затем поймать очередь.Пустое исключение, но я получаю тот же результат. Любая помощь была бы очень признательна. Спасибо.

Ответ №1:

В какой-то момент я сталкиваюсь с той же проблемой. docs.python.org

многопроцессорная обработка класса.Очередь([максимальный размер])

qsize():

Верните приблизительный размер очереди. Из-за семантики > многопоточности/многопроцессорности это число >ненадежно.

Обратите внимание, что это может вызвать ошибку NotImplementedError на платформах Unix, таких как Mac OS X>, где не реализовано значение sem_getvalue ().