只在此山中,雲深不知處
Concurrency
- 使用concurrency來撰寫程式,可以進行平行處理(parallel computing)來提升效能。Go關於concurrency的內容包含goroutines, channels, range&close, select等
Goroutine
- Goroutine類似thread,是做為並行執行的程式碼區塊。
-
: 使用時僅須在函數前加上關鍵字go即可。
- 使用time.Sleep()函數讓程式休息但不關閉,否則main thread關閉程式便結束了,看不到其他結果。
- 使用time.Sleep()函數前須記得import time這個package。
- 每一個routing(thread)爭搶程式執行權,得到者執行程式,所以無法有固定順序執行。
Channel
- 前述的goroutine相互獨立,而Go使用channel在不同並行程式間傳遞資料。
-
需先宣告channel後方能使用,宣告使用make()函數。
- 使用make(chan string)來建立一個傳遞string的channel。
- msg := <-message是將資訊由message傳遞到msg,<-箭頭表示傳遞方向。
-
: 再試一個例子。
- 第一個go計算前半段的array元素和,第二個計算後半段。
-
: Buffered Channel是可以在宣告channel時設定其buffer,有了buffer後可不需等待其他的goroutine,直接傳送資料。
- 設置兩個buffer,傳送(<-)兩次(也就是說傳送3次會出現錯誤,但可以增加goroutine的方式傳送,e.g.)。
-
: 若不再使用channel時,可使用close()將其關閉。
- 原本設置5個buffer,使用兩個後關閉,再使用傳回空。
- channel跟file不同,除非要強調不再有資料傳入,否則不需特別關閉(close),以fibonacci sequence為例。
-
: 之前提到過的select適用於選擇不同的channel,再試一個例子。
- 出現順序不固定,看哪一個goroutine先搶到執行。
- 試試看給每個channel一個buffer,去除time.Sleep()。
- 使用select方式建立另一個求取fibonacci sequence的程式。
- quit <- 0可以傳送任意整數來停止程式,主要是要偵測到這個channel被使用。
- 有default condition的情況,e.g.