協程,又稱微線程和纖程等,據說源于 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