【发布时间】:2012-02-19 09:48:21
【问题描述】:
有两个进程(父进程和子进程)通过管道进行通信。父级正在等待其子级退出,然后从管道的读取端读取数据。孩子可能会产生相当多的输出。管道是否有可能因为其中的未读数据过多而失败并丢失一些孩子的输出?
【问题讨论】:
-
这是你这样做的原因吗?如果进程一次只在一个方向上通信,似乎没有必要使用管道。为什么不让父级生成一个随机文件名并让子级写入该文件?
有两个进程(父进程和子进程)通过管道进行通信。父级正在等待其子级退出,然后从管道的读取端读取数据。孩子可能会产生相当多的输出。管道是否有可能因为其中的未读数据过多而失败并丢失一些孩子的输出?
【问题讨论】:
无需担心:在标准 2.6 或 3.0 内核上,管道缓冲区为 64k - 因此,如果缓冲区已满,第一个进程将在写入时阻塞。
另一方面,如果这太少,请在两个工人之间使用buffer,它具有可配置的内存大小
【讨论】:
是的,如果管道填满子进程块并且您遇到死锁。
这也是在 python 中遇到的问题,请参阅 [1] 中的 Popen.wait() 警告,第 17.1.2 节;他们使用了通信方法来避免这个问题。
【讨论】: