Как я могу узнать почему подпроцесс. Popen ожидают (), ожидает навсегда если stdout=PIPE?

Никогда нет потребность для использования дизайна patterns— можно всегда писать код, который игнорирует все, что стало известно о кодировании до now— это может даже работать. Но шаблоны разработки могут сделать вещи легче, дав Вам общий язык для обсуждения дизайна.

шаблоны Diesign не представляют слишком мало abstraction— они - попытка увеличить уровень абстракции. Можно сказать, что "этот бит является Посетителем", а не "вот некоторый код, который рекурсивно пересекает дерево объектов, работающих на операции на них".

20
задан Graeme Perrow 18 September 2009 в 16:30
поделиться

2 ответа

Когда буфер канала заполняется (обычно 4 КБ или около того), процесс записи останавливается до тех пор, пока процесс чтения не прочитает некоторые из рассматриваемых данных; но здесь вы ничего не читаете, пока подпроцесс не будет завершен, отсюда и тупик. Документы на wait действительно очень четко сформулировали это:

Предупреждение Это зайдет в тупик, если дочерний процесс генерирует достаточно результатов в канал stdout или stderr, чтобы он блокирует ожидание канала ОС буфер для приема дополнительных данных. Использовать общаться (), чтобы избежать этого.

Если вы не можете использовать общение по какой-то причине, пусть подпроцесс записывает во временный файл, а затем вы можете подождать и прочитать это файл, когда он будет готов - запись в файл, а не в канал, не приводит к возникновению тупиковой ситуации.

42
ответ дан 29 November 2019 в 23:33
поделиться

Взгляните на документы . В нем говорится, что вы не должны использовать ожидание, так как это может вызвать мертвую блокировку. Попробуйте использовать связь .

3
ответ дан 29 November 2019 в 23:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: