代码之家  ›  专栏  ›  技术社区  ›  Almad

有人能解释一下管道缓冲死锁吗?

  •  10
  • Almad  · 技术社区  · 14 年前

    Python文档到Popen状态:

    警告:请使用communicate()而不是.stdin.write、.stdout.read或.stderr.read,以避免由于任何其他操作系统管道缓冲区填满并阻塞子进程而导致死锁。

    我的心智模型是:subaccess产生一些东西到stdout/err,它被缓冲,在缓冲区被填满之后,它被刷新到subaccess的stdout/err,后者通过管道发送到父进程。

    无论哪种方式(是否使用管道缓冲区),我都不完全确定死锁是如何发生的。我唯一能想到的是一些“全局”操作系统管道缓冲进程将争取,这听起来很奇怪。另一个原因是更多的进程将共享同一个管道,这不应该单独发生。

    有人能解释一下吗?

    2 回复  |  直到 10 年前
        1
  •  9
  •   S.Lott    14 年前

    小心,这里面有个微妙的错误。

    我的思维模式:子过程产生 有什么要标准化/错误的,那就是 缓冲区填满后, 它被冲到标准/错误 子进程,通过

    缓冲区由父进程和子进程共享。

    当缓冲区被填满时,写入停止,直到缓冲区被清空。Flush对管道没有任何意义,因为两个进程共享同一个缓冲区。

        2
  •  5
  •   Wim    14 年前

    当两个缓冲区(stdin和stdout)都已满时,可能会发生死锁:您的程序正在等待向外部程序写入更多输入,而外部程序正在等待您首先从其输出缓冲区读取数据。

    communicate() 只是为了你。