小编gwt*_*wod的帖子

从事件循环中产生异步生成器数据可能吗?

我想使用httpx从协程内的多个同时发生的 HTTP 流请求中读取数据,并将数据返回给运行事件循环的非异步函数,而不仅仅是返回最终数据。

但是如果我让我的异步函数产生而不是返回,我会收到抱怨asyncio.as_completed()loop.run_until_complete()期望一个协程或一个 Future,而不是一个异步生成器。

因此,我可以让它工作的唯一方法是收集每个协程内的所有流数据,一旦请求完成就返回所有数据。然后收集所有协程结果,最后将其返回给非异步调用函数。

这意味着我必须将所有内容都保存在内存中,并等到最慢的请求完成后才能获取所有数据,这与流式传输 http 请求的全部意义相悖。

有什么办法可以完成这样的事情吗?我目前的愚蠢实现是这样的:

def collect_data(urls):
    """Non-async function wishing it was a non-async generator"""

    async def stream(async_client, url, payload):
        data = []
        async with async_client.stream("GET", url=url) as ar:
            ar.raise_for_status()
            async for line in ar.aiter_lines():
                data.append(line)
                # would like to yield each line here
        return data

    async def execute_tasks(urls):
        all_data = []
        async with httpx.AsyncClient() as async_client:
            tasks = [stream(async_client, url) for url in urls]
            for coroutine …
Run Code Online (Sandbox Code Playgroud)

python python-asyncio httpx

5
推荐指数
1
解决办法
391
查看次数

标签 统计

httpx ×1

python ×1

python-asyncio ×1