Ваша очередь заполняется без пользователя, чтобы очистить ее.
Из определения Queue.put
:
Если блок необязательного аргумента равен True (по умолчанию) и время ожидания равно None (по умолчанию), блокируйте при необходимости до тех пор, пока не освободится свободный слот.
Предполагается, что между производителем и потребителем невозможна тупиковая ситуация (и если исходный код действительно имеет потребитель, так как ваш образец не), в конечном итоге производители должны быть разблокированы и прекратить. Проверьте код вашего потребителя (или добавьте его к вопросу, чтобы мы могли посмотреть)
Обновление
Это не проблема, потому что очередь не имеет был задан максимальный размер, поэтому задание должно выполняться до тех пор, пока не закончится память.
Это не поведение очереди. Как указано в этом билете , здесь блокируется не сама очередь, а нижележащий канал. Из связанного ресурса (вставки между "[]" мои):
Очередь работает так: - когда вы вызываете queue.put (data), данные добавляются в deque, что может расти и уменьшаться вечно - тогда поток извлекает элементы из очереди и отправляет их так, чтобы другой процесс мог получить их через канал или сокет Unix (созданный через socketpair). Но, что немаловажно, оба канала и сокеты unix имеют ограниченную емкость (раньше она составляла 4 КБ - размер страницы - в старых ядрах Linux для каналов, теперь это 64 КБ, и между 64 КБ-120 К для сокетов unix. в зависимости от настраиваемых систем). - когда вы выполняете queue.get (), вы просто выполняете чтение по каналу / сокету
[..], когда размер [становится слишком большим], поток записи блокирует системный вызов записи. А так как соединение выполняется до удаления элемента [note: это ваш process.join
], вы просто зашли в тупик, поскольку соединение ожидает завершения потока отправки, и запись не может быть завершена, так как канал / сокет заполнен! Если вы удалите элемент из очереди перед ожиданием процесса отправки, все будет нормально.
Обновление 2
Я понимаю. Но на самом деле у меня нет потребителя (если это именно то, о чем я думаю), я получу результаты из очереди только после того, как процесс завершит его помещение в очередь.
Да, это проблема. multiprocessing.Queue
не является контейнером для хранения. Вы должны использовать его исключительно для передачи данных между «производителями» (процессами, которые генерируют данные, поступающие в очередь) и «потребителями (процессами, которые« используют »эти данные). Как вы теперь знаете, оставлять данные там - плохая идея .
Как я могу получить элемент из очереди, если я даже не могу поставить его туда первым?
put
и get
скрыть проблему помещения Соберите данные, если они заполняют канал, поэтому вам нужно всего лишь настроить al oop в вашем "основном" процессе на get
элементов из очереди и, например, добавить их в список. в пространстве памяти основного процесса и не забивает трубу.