Python中使用asyncio.get_running_loop()报错RuntimeError的解决方法
解决asyncio.get_running_loop()报错的问题
错误原因
asyncio.get_running_loop()的作用是获取当前线程中正在运行的事件循环,你的代码在调用它时,还没有启动任何事件循环,因此抛出RuntimeError: no running event loop。而旧的asyncio.get_event_loop()会在没有循环时自动创建一个新循环,这也是它被弃用的核心原因——行为不够明确,容易引发意外问题。
正确的使用方式
要正常使用asyncio.get_running_loop(),必须确保调用它时,当前上下文已经存在正在运行的事件循环。最推荐的现代asyncio写法是使用asyncio.run()作为程序入口,它会自动创建、运行并清理事件循环:
import asyncio async def test(): # 在异步函数内部调用get_running_loop(),此时事件循环已启动 loop = asyncio.get_running_loop() # 可基于loop执行其他操作(比如添加后台任务等) for _ in range(3): print("Test") await asyncio.sleep(1) # asyncio.run()自动管理事件循环的生命周期 asyncio.run(test())
运行这段代码会得到预期输出:
Test Test Test
手动管理循环的场景(不推荐)
如果确实需要手动控制事件循环的创建和运行(比如复杂多线程场景),可以先创建循环并启动它,再在异步上下文中获取:
import asyncio async def test(): loop = asyncio.get_running_loop() for _ in range(3): print("Test") await asyncio.sleep(1) # 创建新事件循环并设为当前线程默认循环 loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) try: # 启动循环并运行任务 loop.run_until_complete(test()) finally: # 手动清理循环 loop.close()
这种写法繁琐且容易出错,除非有特殊需求,否则优先使用asyncio.run()。
内容的提问来源于stack exchange,提问作者Super Kai - Kazuya Ito
相关产品推荐
相关产品推荐

