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

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

协程虽然如此之好,看是很长时间以来,因为受到基于堆栈的子例程实现的限制,并没有多少语言在其实语言或库中支持协程,所以线程作为一个替代者(当然,线程也有其超越协程之处)被广泛接受了。但是在今天,很多语言都内建了协程的支持,甚至是 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 中实现完整的协程支持。

转载于:https://my.oschina.net/tenking/blog/29521

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值