Python 3.5 中的 async/await 究竟是如何工作的?

主要观点:

  • 作者作为 Python 核心开发者,希望理解语言的工作原理,之前不理解async/await在 Python 3.5 中的工作方式,决定深入研究。
  • 介绍了 Python 中协程的历史,从 2.2 版本的生成器到 2.5 版本添加的可向暂停生成器发送值的功能,再到 3.3 版本的yield from和 3.5 版本的async/await
  • 解释了事件循环的概念,如 Python 3.4 中asyncio提供的事件循环,以及其在不同场景中的应用。
  • 详细说明了asyncawait在 Python 3.4 和 3.5 中的工作方式,包括字节码层面的差异,以及async函数和生成器基协程的区别。
  • 强调async/await是异步编程的 API,而非等同于asyncio,并通过一个完整的异步编程示例展示其实际应用。
  • 表达了对异步编程未来的希望,希望有更多支持异步编程的库出现,以及 Python 能在async协程中支持yield

关键信息:

  • Python 2.2 引入生成器,2.5 增加向暂停生成器发送值的功能,3.3 引入yield from,3.5 引入async/await
  • 事件循环用于监控事件并调用相关代码,Python 3.4 中asyncio提供事件循环。
  • async函数和生成器基协程的区别,以及await表达式的限制。
  • async/await是异步编程的 API,可通过async def定义函数,通过types.coroutine标记生成器为协程。
  • 一个完整的异步编程示例,展示了如何使用async/await实现并发的火箭发射倒计时。

重要细节:

  • 在 Python 3.4 中,asyncio.coroutine装饰器用于标记协程函数,yield from用于与asyncio事件循环交互。
  • 在 Python 3.5 中,types.coroutine装饰器和async def语法用于标记协程,await表达式用于暂停协程并等待可等待对象。
  • 字节码层面,GET_YIELD_FROM_ITERGET_AWAITABLE操作码在处理协程和可等待对象时有所不同。
  • 目前异步编程库较少,希望更多库出现以提供更好的支持,如aiohttphyper等。
  • 作者希望 Python 能在async协程中支持yield
阅读 72
0 条评论