关于协程

协程是什么
协程,即协做式程序,其思想是,一系列互相依赖的协程间依次使用CPU,每次只有一个协程工做,而其余协程处于休眠状态。协程能够在运行期间的某个点上暂停执行,并在恢复运行时从暂停的点上继续执行。(摘自于网络)

协程实现方式
1.使用c的奇技淫巧
例如Protothreads,使用switch/case 和static(全局变量)的方法。
举个例子: html

int function(void) {
  static int i, state = 0;
  switch (state) {
    case 0: /* start of function */
    for (i = 0; i < 10; i++) {
      state = __LINE__ + 2; /* so we will come back to "case __LINE__" */
      return i;
      case __LINE__:; /* resume control straight after the return */
    }
  }
}

在屡次调用会返回不一样的结果,为何?只是由于static的状态而对这个程序的运转产生影响。固然他有一些缺陷,具体缺陷须要本身研究了。
(摘自:http://coolshell.cn/articles/10975.html

2.setjump/longjump
wiki百科介绍了一个pcl很是轻量级的lib,使用setjmp/longjmp的方法进行协程切换,
固然里边最多的内容是处理上下文和处理signal。pcl地址(http://xmailserver.org/libpcl.html)

3.使用汇编,操做寄存器、控制程序运行。
这个是比较酷的方法。固然对于程序在CPU上如何运行要求比较高。尤为是对ESP,EBP,EIP寄存器指针的做用要求比较高。
这种方法在实现上更加的困难
Python的greenlet。经过将寄存器保存到栈,将栈内容copy to堆上的greenlet上来保存状态,而将greenlet copy to 栈上,
并恢复寄存器而完成协程切换。

(图为:保存系统栈到堆中)
协程的现状
        半死不活的协程
协程在windows、Linux都有官方实现,在通常大而全的介绍API的书中都会提到。在lua,python,ruby中都有实现。可是历来没有一个软件觉得卖点,不多听到协程。而java这个东东干脆就没有这个东西。
为何,我尝试着去从计算机的做用去解释这个事情。计算机运行靠的程序,从大面分有三种:
IO-bound和CPU-bound、混合类型。java


CPU-bound:科学计算、数据挖掘的计算
我的认为CPU-bound类型的任务,协程很难去搀和是很显而易见的,任务流程按照设计很天然的进行流转,即便须要并行处理,也是线程、或者进程。协程仅仅是伪并行,不能充分使用多核技术。
引入他们,一不能并行,二引入了复杂度(其中函数做为运行实体,在单CPU上进行切换,仍是比较难以理解的),整体而言这些都是没必要要的。node


IO-bound任务:好比webserver。fs server
而在多种多样IO-bound的任务中,比较适合的也就是实现了多路复用的慢速IO。在Linux环境上,epoll提供了屡次IO通知,协程自行进行切换,上层应用无所知,在彻底串行的代码中,完成了异步IO。
在windows,java中协程成为了鸡肋,由于他们类似的任务处理方式(IOCP和NIO),系统调用(java虚拟机)完成了IO以后,worker线程才会继续进行工做,完成后续操做。这样的运做方式,协程不折不扣没有了用武之地。
python,这个胶水语言已经愈来愈活跃在编程的世界了,而几乎全部的程序理念均可以在这里找到生存的环境,包括协程,下边我会介绍大名鼎鼎的gevent。

混合类型的任务:网络数据库等
这种任务类型实在很差评判,可是由于协程的适应性较差,很难在这种任务中存活。

协程的威力
美妙的gevent,棘手的nodejs。
(我并不想引起争议,说一下nodejs的优势。nodejs是很是适合js 开发者味道的框架,由于它经过事件通知和js的语法完美结合)

gevent和nodejs在网络模块使用了相同的技术(单指Linux平台)libev,nodejs经过使用回调,在事件通知以后进行后续处理。
试想一下,一个web请求,以后有2次读写数据库,2次读写缓存,这样的一整个逻辑已经被分为5段,很不连贯很不符合咱们人脑的思惟方式。

而使用gevent,顺序的把逻辑写一下,而它经过封装send/recv的系统调用,并在这里进行判断切换,将IO异步化,很是漂亮。以此gevent得到了很高的性能。python

相关文章
相关标签/搜索