channel是訊息傳遞的機制,用於多執行緒環境下lock free synchronization.
它同時具備2個特性:
1. 訊息傳遞
2. 同步
golang裡的channel的效能,可以參考前一篇:
此外,自帶的runtime package裡已經提供了benchmark**,可以執行下面的命令檢視其效能:
go test -v -test.bench=".*" runtime
在我的pc上的結果是:
benchmarkchanuncontended
50000000
67.3 ns/op
benchmarkchancontended
50000000
67.7 ns/op
benchmarkchansync
10000000
181 ns/op
benchmarkchanprodcons0
10000000
198 ns/op
benchmarkchanprodcons10
20000000
98.2 ns/op
benchmarkchanprodcons100
50000000
73.4 ns/op
benchmarkchanprodconswor
k0
1000000
1874 ns/op
benchmarkchanprodconswor
k10
1000000
1805 ns/op
benchmarkchanprodconswor
k100
1000000
1771 ns/op
benchmarkchancreation
10000000
195 ns/op
benchmarkchansem
50000000
66.3 ns/op
channel的實現,都在$goroot/src/pkg/runtime/chan.c裡
它是通過共享記憶體實現的
struct hchan
ch := make(chan inte***ce{}, 5)
具體的實現是chan.c裡的 hchan* runtime·makechan_c(chantype *t, int64 hint)
此時,hint=5, t=inte***ce{}
它完成的任務就是:
分配hint * sizeof(t) + sizeof(hchan)的記憶體空間[也就是說,buffered chan的buffer越大,占用
記憶體越大]
ch <- 5
就會呼叫 void runtime·chansend(chantype *t, hchan *chan, byte *ep, bool *pres)
lock(chan)
如果chan是buffer chan else
} else
golang中channel的用法
go語言的range迴圈可以直接在channels上面迭代。使用range迴圈一次從channel中接受資料,當channel被關閉並且沒有值可接受時跳出循壞。func main close natures go func close squares for x range squares 雙向ch...
Golang 有趣的 channel 應用
嚴格意義上說,本文是我另外一片文章 golang funny play with channel 的中文版本。不過,畢竟是用中文當母語的,所以就不翻譯了,重新按照那個內容寫過吧。channel 是 golang 裡相當有趣的乙個功能,在我使用 golang 編碼的經驗裡,大部分事件都會是在享受 ch...
golang中channel的用法
channel有點類似於管道,它在goroutine同步與通訊中,有著起承轉合的作用,同時也是golang實現csp模型的關鍵 package main func main 以下是channel的一些使用場景 等待goroutine完成 package main func main println ...