續上篇 Day 15 讀 Go Concurrency Patterns - Rob Pike II
傳話遊戲就是將原有的訊息,從第一個人透過肢體動作傳給下一個人,直到傳到最後一個人,並且由最後一個人猜原本的訊息到底是什麼。
接下來用 goroutine 和 channel 模擬這個傳遞的過程吧。
來解讀一下程式:
f
函式,把右邊的訊息 +1 傳給左邊代表著傳話遊戲漸漸失真的訊息左到右
把每個 goroutine 的 channel 連接好仔細看,這裡竟然開了一萬個 goroutine,執行速度還是很快,這章投影片同時想表達的是 goroutine 是很輕量的
Rob Pike 在這時表示,到現在為止做的程式都太玩具了。 Go 是用來設計系統程式的,我們來做一個簡單的 google search engine 吧
先想想 google search 做了什麼:
先做出一個假的 fakeSearch 的框架,並且用它來產生各種假的搜尋,包括 Web、Image、Video
版本一,依序執行,搜尋 Web、搜尋 Image、搜尋 Video,最後再組起來
版本二,用三個 goroutine 執行,再把結果組起來。
注意:這支程式透過 channel 工具,並沒用到傳統的 mutex, conditional variable
仔細想想版本二會有一個問題,總執行時間會是搜尋最慢的那個 goroutine 的執行時間,若是一個 server 回傳的速度非常慢,就會造成總執行時間被拖慢
版本 2.1
注意:這程式有一個問題,如果這個搜尋很久的結果回傳之後呢,因為接收端的 channel 沒有人接收了,這個 goroutine 發送時就被 block ,直到程式結束,造成 goroutine leak,Rob Pike 可能寫投影片時沒注意到,到最後我們再看看怎麼修正吧
十二點又到啦,休息,明日繼續。