【发布时间】:2011-01-23 19:35:38
【问题描述】:
Popen 状态的 Python 文档:
警告使用communicate() 而不是.stdin.write、.stdout.read 或.stderr.read 以避免由于任何其他操作系统管道缓冲区填满并阻塞子进程而导致的死锁。
现在,我正试图弄清楚这种死锁是如何发生的以及为什么会发生。
我的心智模型:子进程向stdout/err产生一些东西,它被缓冲,缓冲区被填满后,它被刷新到子进程的stdout/err,通过管道发送到父进程。
根据文档所述,管道有自己的缓冲区,当它被填充或子进程终止时,它会被刷新到父进程。
无论哪种方式(是否使用管道缓冲区),我都不完全确定死锁是如何发生的。我唯一能想到的是某种“全局”操作系统管道缓冲区进程将努力争取,这听起来很奇怪。另一个是更多的进程将共享同一个管道,这不应该单独发生。
有人可以解释一下吗?
【问题讨论】:
标签: python operating-system pipe