1. 程式人生 > >go語言學習(3)-協程

go語言學習(3)-協程

現在主流os呼叫粒度為執行緒,產生時鐘中斷後,中斷處理函式,如果當前執行緒時間片使用完畢。則切換到其他的執行緒,資源開銷很大。還有建立和銷燬執行緒是和很消耗執行緒資源的。特別是對於我們後臺程式開發,為了減少不必要的效能開銷,廣泛採用"池"進行維護。

於是乎協程出現了,協程可以理解為使用者級別執行緒,它的呼叫由執行緒實現,執行緒進行協程呼叫(協議可以主動讓出時間片)。所以開銷非常小,據統計(不知道真否,沒有測試過)程序可以直接開上w的協程。其實其實這個在很久以前就提出過這個概念。現在在一些的指令碼語言(比如說lua,python)已經開始支援。C語言中也有很多類似開源的協程庫,(例如騰訊的協程庫libco)。

go語言語言級別支援協程。使用關鍵字go,程式碼如下:

func Run(){
/*
*程式碼實現
*/
}
go Run()

現在啟動了一個Run()協程,當然我們也給協程函式()傳遞引數

他同時支援物件的成員函式(),程式碼如下:

type Person struct{

}

func (this *Person) See(){
/*
*程式碼實現
*/
}

func main(){
var person Person

go person.See()
}
這樣的話,我們就不需要進行所謂的“池”的維護,非同步任務採用協程去做,不用擔心協程開銷,對被動的連線處理,直接開啟協程進行IO操作。開發者心智成本大大降低。

協程的使用自然少不了協程之間通訊,協程之間通訊採用隧道channel,channel也是一個引用物件,通過內建函式make(),程式碼如下:

io_chann:=make(chan int, 1)//建立大小1,型別為int的隧道
io_chann<-1 
io_chann<-2 // 隧道已經滿,阻塞

這裡主要說一下協程如何通訊:程式碼如下:

func Recv(chann chan int) {
	for {
		<-chann // 不關心它的值
	}
}

func Send(chann chan int) {
	for {
		chann <- 1
	}
}

func main() {

	chann := make(chan int, 256) // 大小256
	go Recv(chann)
	go Send(chann)
	time.Sleep(100 * time.Second)

上面就是一個簡單的協程之間通訊,很簡單