主要观点:
- 作者作为 Python 核心开发者,希望理解语言的工作原理,之前不理解
async/await在 Python 3.5 中的工作方式,决定深入研究。 - 介绍了 Python 中协程的历史,从 2.2 版本的生成器到 2.5 版本添加的可向暂停生成器发送值的功能,再到 3.3 版本的
yield from和 3.5 版本的async/await。 - 解释了事件循环的概念,如 Python 3.4 中
asyncio提供的事件循环,以及其在不同场景中的应用。 - 详细说明了
async和await在 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_ITER和GET_AWAITABLE操作码在处理协程和可等待对象时有所不同。 - 目前异步编程库较少,希望更多库出现以提供更好的支持,如
aiohttp、hyper等。 - 作者希望 Python 能在
async协程中支持yield。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。