python asyncio.get_event_loop() 弃用

  1. 在 Python 的 asyncio 模块中,asyncio.get_event_loop() 函数已经被标记为弃用(deprecated)并且在 Python 3.10 版本中彻底移除。这是为了鼓励使用 asyncio.run() 和 asyncio.get_running_loop() 函数,这两个函数提供了更清晰和更安全的异步编程模式。

    替代方案

    1. 使用 asyncio.run()

      asyncio.run() 是用来运行最高级别的入口点函数的,它会自动为你创建一个事件循环,运行你的协程,并在完成后关闭事件循环。这是推荐的方式来启动异步程序。

      import asyncio
      async def main():
               await asyncio.sleep(1)
               print(‘Hello…’)
      asyncio.run(main())

      asyncio.run() 应该被用来运行主函数,并且在程序中只能调用一次。

    2. 使用 asyncio.get_running_loop()

      如果你需要在协程内部获取当前运行的事件循环,可以使用 asyncio.get_running_loop()。这个函数只在有事件循环正在运行时才有效,否则会抛出 RuntimeError

      import asyncio
      async 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() 就足够了。

发表评论

邮箱地址不会被公开。