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 =>无缓冲。 如果由于某种原因写入文件操作经历了巨大的延迟,会发生什么?
回答你的问题:
pipe-max-size
限制(cat / proc / sys / fs / pipe-max-size)后,子进程将停留在write
操作上; write
系统调用时,进程将被操作系统阻塞。 在非阻塞IO的情况下,我希望write
系统调用将返回EAGAIN或其他系统特定的错误。 所以实际上,在调用write
系统调用等待管道缓冲区可用时,应用程序会卡住。 这并不意味着它会挂起。 例如,如果一个应用程序实现了某种内部队列并且它有多个线程,它可以继续工作并向其队列添加任何数据,而写出线程将等待缓冲区。