You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用asyncio.as_completed()获取协程对象而非实际ClientResponse响应的问题求助

asyncio.as_completed()获取协程对象而非实际ClientResponse响应的问题求助

看起来你遇到的问题主要有两个方向:一是打印输出里混进了协程对象的信息,二是尝试处理响应时抛出了“coroutine is not iterable”的错误。我来帮你拆解问题并给出解决方案:

首先,先看你代码里的细节:你的fetch_status函数返回的是ClientResponse对象本身,当你await finished_task后打印这个对象时,出现ClientResponse(...)[200 OK]这类输出是正常的——这是ClientResponse的默认字符串表示,不是错误。但如果出现了<coroutine object as_completed.<locals>.wait_for_one...>的输出,大概率是你某次尝试时没有正确await finished_task就直接打印了(比如写了print(finished_task)而不是print(await finished_task))。

然后是你提到的“coroutine is not iterable”错误,这通常是因为你把协程对象当成了可迭代对象来处理(比如直接写for item in finished_task),但协程本身是不能直接遍历的,必须先await拿到实际的返回值才行。

如果你的目标是获取响应的实际内容(比如网页文本、JSON数据),而不是ClientResponse对象,那需要在fetch_status里读取响应内容,修改后的完整代码如下:

import asyncio
import aiohttp
from aiohttp import ClientSession

async def fetch_status(session: ClientSession, url: str) -> str:
    async with session.get(url) as result:
        # 如果是HTML文本,用text();如果是JSON数据,换成await result.json()
        return await result.text()

async def main():
    async with aiohttp.ClientSession() as session:
        fetchers = [
            fetch_status(session, 'https://www.example.com'),
            fetch_status(session, 'https://www.example.com'),
            fetch_status(session, 'https://www.example.com')
        ]
        for finished_task in asyncio.as_completed(fetchers):
            # 必须先await拿到实际的响应内容,再处理
            response_content = await finished_task
            print(response_content)

asyncio.run(main())

几个关键提醒:

  • asyncio.as_completed返回的迭代器,每次生成的是一个待执行的协程,必须通过await才能获取到fetch_status函数的实际返回值。
  • 原代码中fetch_status返回的是ClientResponse对象,它只是响应的封装体,需要调用text()/json()等方法(注意这些方法也是协程,必须加await)才能拿到具体内容。
  • 如果你之前尝试跳过await直接处理finished_task,就会触发“coroutine is not iterable”这类错误,一定要记住:所有协程对象都必须通过await来获取结果。

备注:内容来源于stack exchange,提问作者Ramesh Raj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 07:00:31