主要观点:
- 作者作为 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) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。