创建aiohttp会话后传递至函数失效,请求无执行且无报错
解决AioHTTP异步请求未执行且无输出的问题
嘿,我一眼就瞅出问题所在了——你的异步代码根本没被启动执行!Python里的异步函数(用async def定义的)可不是写完就自动跑的,得靠事件循环来驱动它,不然哪怕函数里写了再多逻辑,也只会躺在那儿睡大觉。
咱们来拆解下你的代码问题:
核心问题:缺少事件循环启动逻辑
你定义了check和post这两个异步函数,但从头到尾都没告诉Python“去运行这个异步任务”。这就好比你写了个菜谱,却从来没开火下锅,自然啥也得不到。
次要问题:不必要的无限循环
check里的while True会无限创建ClientSession实例,这不仅浪费资源,而且如果没加延迟的话,很快会把请求频率拉满,容易触发目标网站的反爬机制,甚至导致本地资源耗尽。
修复后的完整代码
我给你调整了代码,加上了事件循环启动逻辑,还优化了一些细节:
import aiohttp import asyncio async def post(session): try: async with session.get('https://google.nl') as resp: # 先打印状态码,方便排查请求是否成功 print(f"请求状态码: {resp.status}") resp.raise_for_status() # 如果是4xx/5xx状态码,直接抛出异常 return await resp.text() except Exception as e: print(f"请求出错: {str(e)}") return "" async def check(line): # 如果你需要重复请求,记得加延迟 # while True: async with aiohttp.ClientSession() as session: page_source = await post(session) print(page_source) # await asyncio.sleep(5) # 每5秒请求一次,避免频繁请求 # 关键:启动事件循环来运行异步函数 if __name__ == "__main__": # 这里传入你需要的line参数 asyncio.run(check("your_line_here"))
为什么这样改能解决问题?
asyncio.run():这是Python 3.7+官方推荐的异步任务启动方式,它会自动创建事件循环、运行你传入的协程,执行完成后还会自动关闭循环,省心又规范。- 异常捕获:加了
try-except块,哪怕请求失败(比如网络不通、被墙、HTTP错误),你也能看到具体报错信息,不会像之前那样毫无反应。 - 可选的延迟逻辑:如果确实需要重复请求,取消
while True和asyncio.sleep()的注释就能实现,同时控制请求频率。
额外排查点
如果加了事件循环后还是没输出,那大概率是网络问题:比如你的网络无法访问google.nl,这时候session.get()会卡住或者抛出异常。这时候看我们加的错误打印,就能知道具体原因啦。
内容的提问来源于stack exchange,提问作者alkan zwaans
相关产品推荐
相关产品推荐

