2020年5月21日 星期四

golang channel buffered vs unbuffered

buffered vs unbuffered channel 有些網路上文章以 同步與異步來解釋,雖然感覺上有同步與異步,但其並非同步與異步。非常單純就只是有沒有多buffer空間

先看一個案例
func main() {
    c := make(chan bool, 1)
    go func() {
        fmt.Println("go func()", <-c)
        fmt.Println("go func()", <-c)
    }()

    c <- true
    time.Sleep(1 * time.Second)

    c <- false
    c <- true

    fmt.Println("main()")

}
執行結果
go func() true
... (sleep 1 sec) ...
go func() false
main()

就寫入channel而言,只要還有buffer,就在寫入後立即往下執行,反之,會等待有多餘的空間。因此有同步的感覺,事實上,程式仍是在不同的協程中以非同步進行。

就讀出channel而言,有資料就會讀出後立即往下執行,反之,會等待有資料才讀出往下執行。

所以別再以同步或非同步(異步)來理解channel。而是以 阻塞(blocked)來理解才是正確的唷!

另外加以下二個思考題,請大家自行測試,

channel宣告改為以下buffer size = 2 ,執行結果如何?
    c := make(chan bool, 2)
channel宣告的buffer size = 0,大家覺得成立嗎,還是會有error呢?
    c := make(chan bool, 0)

希望以上的解說,能導正對channel的認知

沒有留言:

張貼留言