關於協程

協程是什麼
協程,即協做式程序,其思想是,一系列互相依賴的協程間依次使用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

相關文章
相關標籤/搜索