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

问题描述 投票:1回答:1

因此,我制作了一个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的唯一方法?

提前感谢!

python python-3.x async-await stream python-asyncio
1个回答
0
投票

我最终使用了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)

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

© www.soinside.com 2019 - 2024. All rights reserved.