python子进程管道无缓冲行为

我有下面这段代码来读取子进程中的数据,并将其写入文件。

from subprocess import Popen, PIPE
proc = Popen('..some_shell_command..', shell=True, stdout=PIPE)
fd = open("/tmp/procout", "wb")
while True:
    data = proc.stdout.read(1024)
    if len(data) == 0:
        break
    fd.write(data)
fd.close()

'Popen'默认bufsize是0 =>无缓冲。 如果由于某种原因写入文件操作经历了巨大的延迟,会发生什么?

  • 假设子进程应该产生500GB的数据,那么将所有这些数据存储在内存中,直到父进程读取它们全部为止? (要么)
  • 在将下一个1024字节写入stdout之前,子进程是否会等待父节点读取1024个字节的数据? (要么)
  • 在OS管道缓冲区被填充之后,子进程是否会等待,一旦父进程读取,子进程又恢复写入? (要么)
  • ??

  • 回答你的问题:

  • 不,它不会被存储在内存中。 超过pipe-max-size限制(cat / proc / sys / fs / pipe-max-size)后,子进程将停留在write操作上;
  • 子进程会在卡住之前写入大约1M,直到父进程读取数据块。 这个子进程在接下来的1024字节之后会按照他们将要获得的速度一样快地写入;
  • 是的,在阻塞IO的情况下,当调用write系统调用时,进程将被操作系统阻塞。 在非阻塞IO的情况下,我希望write系统调用将返回EAGAIN或其他系统特定的错误。
  • 所以实际上,在调用write系统调用等待管道缓冲区可用时,应用程序会卡住。 这并不意味着它会挂起。 例如,如果一个应用程序实现了某种内部队列并且它有多个线程,它可以继续工作并向其队列添加任何数据,而写出线程将等待缓冲区。

    链接地址: http://www.djcxy.com/p/77117.html

    上一篇: python subprocess pipe unbuffered behaviour

    下一篇: Python, subprocess, pipe and select