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

While循环中发起多个异步HTTP请求出现协程复用错误如何修复

错误原因

  1. 协程对象不可复用:你调用request("X")时就生成了一个一次性的协程实例,第一次await执行完成后这个实例就会被销毁,下一轮while循环再await同一个实例就会触发你遇到的运行时错误。
  2. 多任务无法并发:你在main函数里连续await三个run_forever调用,而run_forever是死循环,第一个任务启动后会永远阻塞,后面的Y、Z请求永远不会执行。

修改后可运行代码

import asyncio
class Client:
    def __init__(self):
        pass

    # 修改入参:不再接收现成的协程对象,改为接收协程函数和对应的调用参数
    async def run_forever(self, coro_func, *coro_args, interval):
        while True:
            # 每次循环都重新创建新的协程对象,避免复用问题
            res = await coro_func(*coro_args)
            await self._onresponse(res, interval)

    async def _onresponse(self, res, interval):
        if res == "XXX":
            # 自定义X请求业务逻辑
            print(f"处理X请求结果:{res},休眠{interval}秒")
            await asyncio.sleep(interval)
        if res == "YYY":
            # 自定义Y请求业务逻辑
            print(f"处理Y请求结果:{res},休眠{interval}秒")
            await asyncio.sleep(interval)
        if res == "ZZZ":
            # 自定义Z请求业务逻辑
            print(f"处理Z请求结果:{res},休眠{interval}秒")
            await asyncio.sleep(interval)


async def request(something):
    # 这里替换成你实际的aiohttp请求逻辑即可
    if something == "X":
        return "XXX"
    elif something == "Y":
        return "YYY"
    elif something == "Z":
        return "ZZZ"


async def main():
    c = Client()
    # 用create_task创建多个并发任务,避免单个死循环阻塞后续任务启动
    tasks = [
        asyncio.create_task(c.run_forever(request, "X", interval=1)),
        asyncio.create_task(c.run_forever(request, "Y", interval=2)),
        asyncio.create_task(c.run_forever(request, "Z", interval=3))
    ]
    # 等待所有任务运行(因为是死循环会持续执行)
    await asyncio.gather(*tasks)

if __name__ == "__main__":
    asyncio.run(main())

核心修改点

  • 调整run_forever入参规则,每次循环都重新生成新的协程实例执行,解决协程复用报错问题
  • 用asyncio.create_task包装多个定时请求任务,实现并发运行,解决单任务阻塞问题
  • 通过asyncio.gather统一管理所有并发任务,保持事件循环持续运行

内容的提问来源于stack exchange,提问作者koyamashinji

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 09:15:01