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

标签 python python-3.x async-await stream python-asyncio

因此,我创建了一个 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/

相关文章:

Python 2 vs 3。相同的输入,不同的结果。 MD5哈希

c# - 类变量未在异步方法中更新

Javascript 节点获取同步获取

python - 无法导出到 ".csv"文件 - pandas.DataFrame

python - 为什么 pandas 逻辑运算符没有像它应该的那样在索引上对齐?

python - 使用 http.client 登录网站

python-3.x - 为什么我得到矩阵未对齐 DataFrame 点函数的错误?

Python:仅将 csv 文件中的一些属性提取到 numpy 数组

python - 使用 Python 进行简单的图像处理

c# - 异步等待很少有混淆