-
在 Python 的
asyncio模块中,asyncio.get_event_loop()函数已经被标记为弃用(deprecated)并且在 Python 3.10 版本中彻底移除。这是为了鼓励使用asyncio.run()和asyncio.get_running_loop()函数,这两个函数提供了更清晰和更安全的异步编程模式。替代方案
-
使用
asyncio.run()asyncio.run()是用来运行最高级别的入口点函数的,它会自动为你创建一个事件循环,运行你的协程,并在完成后关闭事件循环。这是推荐的方式来启动异步程序。import asyncioasync def main():await asyncio.sleep(1)print(‘Hello…’)asyncio.run(main())asyncio.run()应该被用来运行主函数,并且在程序中只能调用一次。 -
使用
asyncio.get_running_loop()如果你需要在协程内部获取当前运行的事件循环,可以使用
asyncio.get_running_loop()。这个函数只在有事件循环正在运行时才有效,否则会抛出RuntimeError。import asyncioasync def my_function():loop = asyncio.get_running_loop()await loop.create_task(asyncio.sleep(1))print(‘Running in the event loop’)async def main():await my_function()asyncio.run(main())
为什么弃用
asyncio.get_event_loop()?asyncio.get_event_loop()有时会导致一些问题,比如:-
在没有事件循环运行时调用它会导致抛出异常。
-
开发者可能不小心在多个地方创建了事件循环,这会导致混乱和难以调试的错误。
-
asyncio.run()提供了一个更清晰的方式来管理事件循环的创建和关闭,从而减少了错误和复杂度。
因此,使用
asyncio.run()和asyncio.get_running_loop()可以帮助你编写更清晰、更健壮的异步代码。如果你在维护旧代码或者迁移到新版本 Python 时遇到问题,确保更新你的代码以使用这些新的 API。如果你确实需要在一个没有事件循环的环境中获取默认的事件循环(尽管这种情况比较少见),可以使用asyncio.new_event_loop()和asyncio.set_event_loop()来手动管理事件循环,但这通常不是推荐的做法。在大多数情况下,使用asyncio.run()就足够了。 -