因此,我创建了一个 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)
这不是我设想的理想解决方案(以某种方式直接在输入和输出之间传输数据),但仍然足够好......
关于python - 如何在Python3中将异步生成器流转换为类似文件的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59413796/