天天看點

協程,又稱微線程和纖程

協程,又稱微線程和纖程等,據說源于 Simula 和 Modula-2 語言(我沒有深究,有錯請指正),現代程式設計語言基本上都有支援,比如 Lua、ruby 和最新的 Google Go,當然也還有最近很讓我驚豔的 falcon。協程是使用者空間線程,作業系統其存在一無所知,是以需要使用者自己去做排程,用來執行協作式多任務非常合适。其實用協程來做的東西,用線程或程序通常也是一樣可以做的,但往往多了許多加鎖和通信的操作。

下面是生産者消費者模型的基于搶占式多線程程式設計實作(僞代碼):

// 隊列容器

var q := new queue

// 消費者線程

loop

lock(q)

get item from q

unlock(q)

if item

use this item

else

sleep 

// 生産者線程

loop

create some new items

lock(q)

add the items to q

unlock(q)

由以上代碼可以看到線程實作至少有兩點硬傷:

1、對隊列的操作需要有顯式/隐式(使用線程安全的隊列)的加鎖操作。

2、消費者線程還要通過 sleep 把 CPU 資源适時地“謙讓”給生産者線程使用,其中的适時是多久,基本上隻能靜态地使用經驗值,效果往往不由人意。

而使用協程可以比較好的解決這個問題,下面來看一下基于協程的生産者消費者模型實作(僞代碼):

// 隊列容器

var q := new queue

// 生産者協程

loop

while q is not full

create some new items

add the items to q

yield to consume

// 消費者協程

loop

while q is not empty

remove some items from q

use the items

yield to produce