我们正在编写一个类,该类调用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()不能。