bTodo在线任务管理

简洁易用的在线任务管理系统 ...

↑我也要推荐

Python 协程:协程才是未来 / 被线程替代 / 推与拉

发布时间:2011-06-15 07:07:55, 关注:+20477, 赞美:+37, 不爽:+8

本文标签: 协程

协程三篇之一(协程初接触)

协程虽然如此之好,看是很长时间以来,因为受到基于堆栈的子例程实现的限制,并没有多少语言在其实语言或库中支持协程,所以线程作为一个替代者(当然,线程也有其超越协程之处)被广泛接受了。但是在今天,很多语言都内建了协程的支持,甚至是 C/C++ 语言。MS Windows 2000 以后的版本,都支持所谓的 Fiber,即纤程,其实就是协程的别称;在开源平台,POSIX 标准也定义了协程相关的标准,GNU Portable Threads 实现了跨平台的用户空间线程,即协程的另一种别称。在这百花齐放的时节,正是我们好好学习和利用它的时机。

python 自身的协程实现?

我对于 python 的协程的观点是:“python 自身已经提供了实现协程的基础条件,是可以很容易的实现概念中的协程。但是由于栈的问题,只能由循环的方式来实现调用。而 stackless 在 python 原有的基础上,改进了 python 在协程上的实现方式,使其代码的表达更加的自然。”

协程才是未来-性能夸张的协程服务器

下面给出一些对比数据,测试环境不同,但是数据不会相差太大:
1、大部分python web framework,600req/s
2、web.py,800req/s
3、曾经在土豆网用twisted写的htmid框架,2300req/s
4、nginx+mod_wsgi,2900req/s
5、eventlet,约5800req/s

当然,如上的服务器功能确实少了点,但是提供了这样一种基础,方便以后扩展。记得N年前看过一篇论文说服务器的发展是多进程=>多线程=>异步=>协程。而现在主流的高性能服务器都是基于异步的(lighttpd、nginx),这次试了一下协程,效果果然不同凡响。

协程和纤程

总的看来,协程有三个好处:

避免了传统的函数调用栈,使得无限递归成为可能
用户态的线程调度,极大降低上下文切换的开销,使得近乎无限并发的“微线程”成为可能
由于可以在用户态进行手工线程调度,这样可以避免锁机制

其实这里的“微线程”、纤程、协程,甚至用户态线程,其实可以理解为都是一码事,只是实现和概念的区别。

推与拉

Python 通过 yield 关键字既可以方便的将数据推送给调用者,也可以从调用者那拉来数据。实际上,yield 关键字只是协程(Coroutine)不完全实现, 而协程恰恰是实现推拉互动的所谓非抢占式协作的关键。不过,哪怕是不完整的实现,也让 Python 在数据推拉相关的程序上的表达力丰富了许多,以至于很多人觉得有必要在 Python 中实现完整的协程支持。

westhood @python4cn 这也是一份很好的关于coroutine的资料。http://t.cn/hbYqk9

如果你觉得本站对你有帮助,欢迎向本站赞助 :P

使用支付宝捐赠

Copyright© Python4cn(news, jobs) simple-is-better.com, 技术驱动:powered by web.py 空间主机:Webfaction

版权申明:文章转载已注明出处,如有疑问请来信咨询。本站为 python 语言推广公益网站,与 python 官方没有任何关系。

联系/投搞/留言: en.simple.is.better@gmail.com 向本站捐赠