[转载]Python 3.5 协程究竟是个啥

时间:2023-09-27 04:59
-->

http://www.mareenoire.info/2016/03/10/how-the-heck-does-async-await-work-in-python-3-5/

[译] Python 3.5 协程究竟是个啥

Yusheng · Mar 10, 2016

  • 原文链接 : How the heck does async/await work in Python 3.5?
  • 原文作者 : Brett Cannon
  • 译文出自 : 掘金翻译计划
  • 译者 : @Yushneng
  • 校对者: @L9m,@iThreeKing

作者是 Python 语言的核心开发人员,这篇文章也是我分享的,但是在翻译之前并没有看得太仔细。作者在这篇文章里先是是从 Python 异步编程的发展历史一直介绍到 Python 3.5 中 async/await 新特性的提出,又从底层的实现的差异一直延伸到完整的代码实例,来说明旧的生成器作为协程的“权宜之计”与新语法的差别。真正做到了深入浅出地厘清了 Python 3.5 异步编程的各种概念及其原理,非常值得学习!协程和事件循环无论从理念还是实现上,都比线程好太多,看完这篇文章之后你一定会和作者有同样的感受:“我要在所有地方都用协程!”,所以,还在用 2.7 的,赶紧升级吧!

以下为译文全文,感谢@L9m,@iThreeKing的审校。


作为 Python 核心开发者之一,让我很想了解这门语言是如何运作的。我发现总有一些阴暗的角落我对其中错综复杂的细节不是很清楚,但是为了能够有助于 Python 的一些问题和其整体设计,我觉得我应该试着去理解 Python 的核心语法和内部运作机制。

但是直到最近我才理解Python 3.5 中 async/await 的原理。我知道Python 3.3 中的 yield from 和 Python 3.4 中的 asyncio 组合得来这一新语法。但较少处理网络相关的问题 - asyncio 并不仅限于此但确是重要用途 - 使我没太注意 async/await 。我知道:

yield from iterator

(本质上)相当于:

for x in iterator:
yield x

我知道 asyncio 是事件循环框架可以进行异步编程,但是我只是知道这里面每个单词的意思而已,从没深入研究 async/await 语法组合背后的原理,我发现不理解 Python 中的异步编程已经对我造成了困扰。因此我决定花时间弄清楚这背后的原理究竟是什么。我从很多人那里得知他们也不了解异步编程的原理,因此我决定写这篇论文(是的,由于这篇文章花费时间之久以及篇幅之长,我的妻子已经将其定义为一篇论文)。

由于我想要正确地理解这些语法的原理,这篇文章涉及到一些关于 CPython 较为底层的技术细节。如果这些细节超出了你想了解的内容,或者你不能完全理解它们,都没关系,因为我为了避免这篇文章演变成一本书那么长,省略了一些 CPython 内部的细枝末节(比如说,如果你不知道 code object 有 flags,甚至不知道什么是 code object,这都没关系,也不用一定要从这篇文字中获得什么)。我试着在最后一小节中用更直接的方法做了总结,如果觉得文章对你来说细节太多,你完全可以跳过。

Copyright© 黑海资讯

鄂ICP备2023014923号