如何在Python3中将异步生成器流转换为类似文件的对象?

2024-06-16 11:57:17 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我创建了一个webservice(基于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()方法等待并返回请求.stream. 但是如果调用者传递一个大小,我需要一个内存缓冲区,不是吗?有什么东西是基于BufferedRWPair的吗?你知道吗

或者,在将整个流提供给fastavro之前,只有这样才能先将其存储到磁盘或内存中?你知道吗

提前谢谢!你知道吗


Tags: 文件方法内存webstreamrequestservicewith
1条回答
网友
1楼 · 发布于 2024-06-16 11:57:17

我最终使用了一个spooledtemporary文件:

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)

它不是我设想的理想解决方案(以某种方式在输入和输出之间直接传输数据),但仍然足够好。。。你知道吗

相关问题 更多 >