Документация Python для Popen гласит:
Предупреждение. Используйте messages () вместо .stdin.write, .stdout.read или .stderr.read, чтобы избежать взаимных блокировок из-за того, что любой из других буферов буфера ОС заполняет и блокирует дочерний процесс.
Теперь я пытаюсь выяснить, как может возникнуть этот тупик и почему.
Моя ментальная модель: подпроцесс производит что-то для stdout / err, который буферизуется, и после заполнения буфера он сбрасывается в stdout / err подпроцесса, который отправляется через канал в родительский процесс.
Из того, что указано в документации, канал имеет свой собственный буфер, а когда он заполнен или подпроцесс завершается, он сбрасывается в родительский процесс.
В любом случае (с канальным буфером или нет) я не совсем уверен, как может возникнуть тупик. Единственное, о чем я могу думать, это о том, что к чему-то будут стремиться «глобальные» процессы конвейерного буфера ОС, что звучит странно. Другая причина заключается в том, что большее количество процессов будет использовать один канал, что не должно происходить само по себе.
Может кто-нибудь объяснить это?