Python 3.5.0 RC3
发布,这是一个预览版本,强烈不推荐在生产环境中应用该版本。

现在 Python
已经支持用协程进行异步处理。但最近有建议称添加协程以全面完善
Python
的语言结构,而不是像现在这样把他们作为生成器的一个类型。此外,两个新的关键字———异步(async)和等待(await),都该添加到
Python 中来支持协程。

作为最后一个RC版本,它已经无限接近于最终发布版,绝大多数预定特性已经完成,所以你拿它尝尝鲜还是可以的…

澳门新葡亰游戏网址 1

Python3.5.0的最终版本将在一周之内发布,大概是在北京时间2015年9月14日左右.
^_^

异步等待的 Python 协程

让我们来看看3.5.0版本有什么感人的新特性:

也许有人不太了解协程,其实协程的原理很简单,打个比方就能讲明白了:假设有十个人去食堂打饭,这个食堂比较穷,只有一个打饭窗口和一个打饭阿姨,那么打饭就只能一个一个排队进行。这十个人胃口很大,每个人都要点5个菜,但这十个人都喜欢犹豫不决,点菜的时候每点一个菜后再想下一个菜点什么,因此后面的人等得很着急呀。

  • PEP 441,
    改善了Python对zip应用程序的支持,如果有一个后缀名为”.pyz”的zip格式的压缩包,在根目录下面有一个”__main__.py”,那你可以使用Python直接运行它.

这样一直站着也不是个事儿,所以打菜的阿姨看到某人犹豫5秒后就会吼一声,让他排到队伍末尾,让别人先打菜,等轮到他的时候他也差不多想好吃什么了。这确实是个不错的方法,但也有一个缺点,那就是打菜的阿姨会等每个人5秒钟,如果那个人在5秒内没有做出决定吃啥,其实这5秒就浪费了。一个人点一个菜就是浪费5秒,十个人每个人点5个菜可就浪费的多啦「菜都凉了要」。

那怎么办呢?阿姨又发话了:大家都是学生,学生就要自觉,我以后也不主动让你们排到末尾了,如果你们觉得自己会犹豫不决,就主动点直接点一个菜就站后面去,等下次排到的时候也差不多想好吃啥了。

  • PEP 492,
    通过async和await语法增加对协程的支持,使协程成为Python语言的原生特性,并”建立一种普遍,易用的异步编程思维模型.”

这个方法果然有效,大家点了菜后想的第一件事情不是下一个菜吃什么,而是自己会不会犹豫,如果会犹豫那直接排到队伍后面去,如果不会就接着点菜。这样一来整个队伍的效率自然就高了。

OK.介绍完了,让我们安静地等待最终版本的发布吧~~

这个例子里,排队阿姨的那声吼就是我们的 CPU
中断,用于切换上下文。每个打饭的学生就是一个
task。而每个人决定自己要不要让出窗口的这种行为,其实就是我们协程的核心思想。

澳门新葡亰游戏网址,下载: 

OK,回到主题,协程就是一种可以在代码的各种预定义位置暂停和恢复执行的函数,它避免了无意义的调度,由此提高代码性能。而子程序是一种特殊的协同程序,它只有单一入口,通过回调来完成执行。Python
的协程「现有的以生成器为基础的协程和新提出的协程」不是一般意义上的协程,因为在执行暂停时它们只能将控制权转给调用者,而不是像常见的那样将控制权转给别的协程。辅之以事件循环,协程可用于异步处理,尤其是在
I / O 中。

文章转载自:开源中国社区 []    

Python 当前支持的协程基于
PEP342
增强型生成器,于 Python 2.5 版本开始采用。该 PEP 将 yield
语句改为表达式,并为生成器增加了一些新的方法 「 send() , throw() , and
close() 」 ,同时确保 close()
方法在生成器进入垃圾回收阶段时得到调用。该功能在 Python 3.3 版本的 PEP
380
中得到进一步增强,它通过增加 yield
表达式,允许生成器将部分功能授予另一个生成器「即子生成器」。

以上方法都使协程依赖于生成器,这使得在代码段何处进行异步调用变得令人困惑,且颇受限制。尤其,with
和 for 声明在理论上可以将协程用于异步调用,但 Python
语法在那些位置不允许使用 yield
表达式,因此无法进行异步调用。此外,如果协程的重构将 yield 或 yield from
从函数中移除 ,它就不再被视为协程,这会导致一些不明显的错误; asyncio
模块通过 @asyncio.coroutine装饰器来弥补这方面的不足。

PEP
492
旨在解决以上所有问题。其想法源于 Yury Selivanov 在四月中旬提出的
python-ideas 邮件列表,该想法受到很多人热情追捧。在5月5日,Guido van
Rossum 同意将它添加在 Python 3.5
版本中。不仅如此,5月12日就得到执行。一切都进展迅速,尽管最终该方法还是在
python-idea 和 python-dev 方面引起热情讨论。

从语法角度看,变化相当简单:

    async def read_data(db):
        data = await db.fetch('SELECT ...')
    ...
网站地图xml地图