協程:本質上是一種使用者態執行緒,不需要作業系統來進行搶占式排程,且在真正的實現重寄存於執行緒中,因此,系統開銷極小,可以有效提高執行緒的任務併發性,從而避免多執行緒的缺點。使用協程的優點是程式設計簡單,結構清晰;缺點是需要語言的支援。
協程最大優勢:」輕量級」,可以輕鬆建立上百萬個而不會導致系統資源衰竭,執行緒和程序最多不超1萬個
go語言支援協程(輕量級執行緒)
(1)go語言採用訊息機制作為通訊方式
(2)channel是go語言在語言級別提供的goroutine間的通訊方式
(3)channel是型別相關的,也就是說乙個channel只能傳遞一種型別的值,且channel必然是同時支援讀寫的
有關channel的基本語法
(1)宣告:
var channame chan elementtype
宣告乙個傳遞型別為int的channel
var ch chan int
(2)定義
ch:=make(chan int)
宣告並初始化
(3)讀寫
讀:<-ch
寫:ch<-
寫入:
ch<-value//向channel寫入資料通常會導致程式阻塞,直到有其他goroutine從這個channel中讀取資料
讀取:
value:=<-ch
如果channel之前沒有寫入資料那麼從channel中讀取資料也會導致程式阻塞,知道channel中被寫入資料為止
(4)帶緩衝的channel
建立方式:
c:=make(chan int,1024)
//建立了乙個大小為1024的int型別channel,再緩衝區沒有填完前可以一直寫入
讀取方式:
for i:=range c
(5)關閉
close(ch)
如何判斷他已經關閉:
x,ok:=<-ch
只需要看第二個bool返回值就好了,如果他是false則說明已經關閉了
go語言中的select
特點:只要其中乙個case已經完成,程式就會繼續往下執行,而不會考慮其他case的情況
例子:
select
如何利用select避免超時等待的問題
timeout:=make(chan
bool
,1)go
func()()//匿名函式
select
未完… Go語言 併發篇
go語言 併發篇 2012 06 06 09 55 by 軒脈刃,當被問到為什麼用go語言,一定不得不提的是go語言的併發程式編寫。在c語言中編寫非常繁瑣複雜的併發程式在go語言中總是顯得如此便捷。go中併發程式依靠的是兩個 goroutine和channel 對於初學者,goroutine直接理解...
Go語言基礎 併發
並行 多件事在同一時刻發生。併發 多件事在同一時間間隔發生。摘自 和 concurrent and parallel programming 上文如果用程式設計師的語言來講,cpu處理器相當於上圖的咖啡機的角色,任務相當於佇列中的人。一定要仔細閱讀此文 這篇文章提到了網路伺服器併發連線數 吐吞量 寬...
go語言併發程式設計
協程 coroutine 本質上是一種使用者態執行緒,不需要作業系統來進行搶占式排程,且在真正的實現中寄存於執行緒中,系統開銷極小。package main import fmt func count ch chan int,i int func main for ch range chs chan...