Python递归限制问题:asyncio&aiohttp无限请求循环触发RecursionError
解决asyncio+aiohttp递归调用导致的RecursionError问题
你的问题出在main函数请求失败时递归调用自身,再加上外层的while True循环,相当于双重嵌套递归调用——每次失败都会在调用栈里新增一层main函数的调用,Python默认递归深度有限(约1000层),多次失败后就会触发RecursionError。
绝对不要尝试禁用递归限制,这会直接导致栈溢出崩溃,正确的做法是用循环代替递归,同时优化资源使用:
修正后的代码
import aiohttp import asyncio async def main(): # 只创建一次ClientSession,复用连接池 async with aiohttp.ClientSession() as session: while True: try: async with session.patch("https://mywebsite.com") as resp: if resp.status == 200: print("请求成功,退出程序") return else: print(f' > 请求失败,状态码: {resp.status} ') except Exception as e: print(f' > 请求出错: {str(e)} ') # 加延迟避免频繁请求,可根据需求调整时长 await asyncio.sleep(1) if __name__ == "__main__": loop = asyncio.get_event_loop() loop.run_until_complete(main())
关键修改说明
- 把递归调用改成async函数内部的
while True循环,彻底避免调用栈堆叠 - 将
ClientSession移到内部循环外,复用连接池,减少资源消耗并提升请求效率 - 增加全局异常捕获,处理网络超时、连接中断等非状态码类错误
- 添加
asyncio.sleep(),避免短时间内高频请求给服务器造成压力
内容的提问来源于stack exchange,提问作者nomiks
相关产品推荐
相关产品推荐

