因此,我制作了一个Web服务(基于starlette),其端点接受二进制主体。我想将这个二进制体喂给fastavro。
[Starlette doc says,我可以使用request.stream()
作为异步流访问原始数据。
async for chunk in request.stream():
# do something with chunk...
现在,我想将流提供给fastavro。关键是,fastavro reader需要一个类似文件的输入流:
with open('some-file.avro', 'rb') as fo:
avro_reader = reader(fo)
我的问题是,有没有一种干净的方法可以将该异步流转换成类似文件的流?
我想我可以实现一个具有read()方法的对象,该方法等待并返回request.stream返回的数据。但是,如果调用者通过一个大小,我需要一个内存缓冲区,不是吗?可以基于BufferedRWPair吗?
或者是将整个流首先存储到磁盘或内存,然后再将其馈送给fastavro的唯一方法?
提前感谢!
我最终使用了SpooledTemporaryFile:
data_file = SpooledTemporaryFile(mode='w+b',
max_size=MAX_RECEIVED_DATA_MEMORY_SIZE)
async for chunk in request.stream():
data_file.write(chunk)
data_file.seek(0)
avro_reader = reader(data_file)
这不是我设想的理想解决方案(以某种方式直接在输入和输出之间传输数据),但仍然足够好...