如何以合理的缓冲区大小有效地执行read(),但在短暂读取后早返回

时间:2019-01-17 21:54:34

标签: python

我们正在编写一个类,该类调用io对象(可能(但不一定)是文件或管道)上的read。该流包含大量格式(长度,blob)的小二进制消息,不是固定长度,而是100字节的顺序。

两个明显的选择是

while True:
   length = unpack(f.read(4))
   blob = read(length)

工作正常,但速度较慢或:

while True:
   buffer = f.read(8192)
   for blob in unpack_buffer(blob):
       ...
   # handle the remainder

速度很快,但是当在实时流中从管道中读取数据时,直到那里的数据达到8K时,它才会返回,因此不适用于偶尔输入的延迟。

我们已经考虑了非阻塞读取,但是该路径是有问题的,因为它并不总是有fd,而且我们也不愿意在用户传递的文件对象上弄乱文件对象的参数。

是否有某种方法可以使read()在存在某些数据后立即返回小于8192字节的部分缓冲区?我相信底层的Unix read()syscall可以做到这一点,但fread()不能。

0 个答案:

没有答案