Python - Получение исключения Queue.Empty из непустой многопроцессорной обработки. - PullRequest
2 голосов
/ 02 августа 2011

Многие пользователи Python сталкиваются с противоположной проблемой - моя программа использует слишком мало процессора.Я уже получил помощь при переходе на многопроцессорную обработку, чтобы использовать все четыре ядра моего рабочего компьютера, и в результате я увидел реальное улучшение производительности.Но улучшение несколько ненадежно.Использование ЦП моей программы, по-видимому, ухудшается, поскольку она продолжает работать - даже при запущенных шести процессах.После добавления некоторых отладочных сообщений я обнаружил, что это произошло из-за того, что некоторые процессы, которые я порождал (все они должны работать до завершения), умирали преждевременно.Основная часть метода, который запускают процессы, представляет собой цикл while True, и единственным выходом является этот блок:

try:
    f = filequeue.get(False)
except Empty:
    print "Done"
    return

filequeue заполняется до создания подпроцессов, поэтому он определенно не является на самом делепустой.Все процессы должны завершиться примерно в одно и то же время, когда он фактически опустеет.Я попытался добавить ненулевой параметр времени ожидания (0,05) в вызов Queue.get, но это не устранило проблему.Почему я могу получить исключение Queue.empty из непустой очереди?

Ответы [ 2 ]

3 голосов
/ 02 августа 2011

Я предлагаю использовать filequeue.get(True) вместо filequeue.get(False). Это приведет к блокировке очереди, пока не будет больше элементов.

Однако он будет блокироваться навсегда после обработки последнего элемента.

Чтобы обойти это, основной процесс может добавить специальный объект «страж» в конце каждой очереди. Рабочие прекращали видеть этот специальный объект (вместо того, чтобы полагаться на пустоту очереди).

1 голос
/ 23 июня 2013

У меня была похожая проблема, и в результате экспериментов, не читая документы, я обнаружил, что даже когда очередь не пуста, get (False) все еще может с пустыми руками бросить Empty.В моем случае использования работникам приходится выходить, когда им не хватает работы в очереди, поэтому get (True) не вариант.

Мое решение было следующее: я обнаружил, что если в "кромеПусто: блок, я проверяю, что очередь действительно пуста (), она работает - empty () не вернет True, если очередь действительно пуста.

Я использовал Python 2.7.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...