WedX - журнал о программировании и компьютерных науках

Python multiprocessing.Manager (). Queue (): тупик при попытке присоединиться к процессам

Я использую многопроцессорный веб-сканер. Я использовал Manager (). Queue () для создания очереди имен файлов, которые скачает поисковый робот. Все процессы используют одну и ту же очередь, и они также выполняют операции put () и get () в очереди. Когда я читал о классе Queue (), он является потокобезопасным и может превратить мою очередь в очередь блокировки, и это решает проблему процесса, пытающегося получить () элемент из пустой очереди. Однако возникает другая проблема: когда в очереди, наконец, есть только несколько элементов, какой-то процесс, скажем, процесс 1, обнаруживает, что он непустой, а затем все эти элементы выталкиваются другим процессом, скажем, процессом 2, а затем процесс 1 пытается get () элемент из очереди, но обнаруживает, что он пуст, поэтому его вызов get () заблокируется навсегда.

Попытка решения: разрешить тайм-аут для get (), чтобы при истечении тайм-аута get () генерировал исключение «очередь пуста», и после этого процесс завершался.

Но похоже, что это решение не могло сработать, потому что иногда программа зависает на этапах process.join ().

Может ли кто-нибудь мне с этим помочь? Мой английский не так хорош, но я был бы очень признателен, если бы вы подумали об этой проблеме. Спасибо.


  • Не используйте queue.empty проверки для нескольких потребительских сценариев. Это антипаттерн, потому что проверка и последующие действия в соответствии с результатом этой проверки не являются атомарной операцией без блокировки вокруг нее. В моем ответе здесь описано, как get() из Multiprocessing.Queue. Вопрос не идеально подходит, потому что Manager.Queue - это очередь потоков (queue.Queue) под капотом, но решение то же самое ... 15.12.2018
  • Не проверяйте () и get (), просто get () и передайте дозор в качестве окончательного значения для разрыва цикла get. Для x потребителей передайте x дозорных. 15.12.2018
  • Спасибо! Решил проблему по-твоему. 20.12.2018
  • Добро пожаловать и благодарим за отзыв! 20.12.2018

Новые материалы

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


Для любых предложений по сайту: [email protected]