Golang Concurrency Note 2

Rain Wu
Golang 筆記
Published in
3 min readMar 1, 2019

Select

前兩篇筆記所提到的,都是一個 Goroutine 中同一時間只需考慮一個 Channel 的阻塞問題,那如果同時需要監聽多個 Channel 個別做不同的處理呢?聽起來是個肯定會用到的技術,但想了想覺得不好處理,Golang 同樣提供了我們一個優雅的處理方法,那就是 Select。

$ go build
$ .\select_practice.exe
waitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwait1
waitwaitwaitwaitwait1
waitwait2
waitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwaitwait3
waitquit

可以看到 line 8~16 行實現了 select 的設計,如果能對 Channel c send 則運算下一步的費式數列,若能對 Channel quit recieve 則打印 quit 並回傳函數,而當所有 Channel 都被阻塞時,預設會打印 wait 出來。

line 23~28 直接以匿名方法創建 Goroutine,和 line 29 的 fibonacci Goroutine 交替執行,直到 line 27 將 0 send 給 quit 觸發 fibonacci 的 return,完成整個程式的執行。

Timeout

如果 Goroutine 阻塞了把執行權轉讓後,一直沒能獲得繼續執行的機會,那總不能讓他一直卡著吧?尤其是一些重要的 Goroutine,塞住一段時間後還是需要處理一下比較好,這時候可以使用 Golang 的 Timeout 機制來強制性的處理阻塞的 Goroutine。

因為沒有任何對 Channel c send 的指令,因此 line 11 的 case 並無法觸發,而 line 13 設定了在 5秒後便執行此 case,打印 timeout 後對 Channel o send true,讓 line 20 得以繼續執行,隨後完成整個程式。

Ref

附上優質的 Github 教程,Concurrency 入門的筆記就先寫到這裡,整體感覺和先前熟悉的 event-driven 有點類似,又有點不同。不過能確定的是應該需要投入更多時間鑽研才能熟練 Concurrency~XD,再麻煩路過的大大不吝指教了。

--

--

Rain Wu
Golang 筆記

A software engineer specializing in distributed systems and cloud services, desire to realize various imaginations of future life through technology.