iT邦幫忙

2021 iThome 鐵人賽

DAY 9
0
自我挑戰組

golang 後端菜雞工程師學習雜記系列 第 16

Day 16 讀 Go Concurrency Patterns - Rob Pike III

  • 分享至 

  • xImage
  •  

續上篇 Day 15 讀 Go Concurrency Patterns - Rob Pike II

傳話遊戲 (Chinese whispers game)

傳話遊戲就是將原有的訊息,從第一個人透過肢體動作傳給下一個人,直到傳到最後一個人,並且由最後一個人猜原本的訊息到底是什麼。

接下來用 goroutine 和 channel 模擬這個傳遞的過程吧。

來解讀一下程式:

  • 可以將每一個 gopher 當作一個 groutine
  • 對於每一隻 gopher 來講,他需要從右邊接收訊息,並且把訊息傳向左邊,所以我們可以設計出投影片裏的 f 函式,把右邊的訊息 +1 傳給左邊代表著傳話遊戲漸漸失真的訊息
  • 這支程式的做法是從左到右把每個 goroutine 的 channel 連接好
  • 最兩行程式則是從最右邊傳送訊息,從最左邊接收

仔細看,這裡竟然開了一萬個 goroutine,執行速度還是很快,這章投影片同時想表達的是 goroutine 是很輕量的

模擬 Google search

Rob Pike 在這時表示,到現在為止做的程式都太玩具了。 Go 是用來設計系統程式的,我們來做一個簡單的 google search engine 吧

先想想 google search 做了什麼:

  • 你丟一個搜尋請求,google 回應你搜尋結果
  • 我們丟出去的請求,通常會搜尋網頁、Youtube、地圖、新聞等等

先做出一個假的 fakeSearch 的框架,並且用它來產生各種假的搜尋,包括 Web、Image、Video

版本一,依序執行,搜尋 Web、搜尋 Image、搜尋 Video,最後再組起來


版本二,用三個 goroutine 執行,再把結果組起來。
注意:這支程式透過 channel 工具,並沒用到傳統的 mutex, conditional variable


仔細想想版本二會有一個問題,總執行時間會是搜尋最慢的那個 goroutine 的執行時間,若是一個 server 回傳的速度非常慢,就會造成總執行時間被拖慢
版本 2.1

  • 加上 timeout 時間,若只要 search 時間超過,就不使用這個結果

注意:這程式有一個問題,如果這個搜尋很久的結果回傳之後呢,因為接收端的 channel 沒有人接收了,這個 goroutine 發送時就被 block ,直到程式結束,造成 goroutine leak,Rob Pike 可能寫投影片時沒注意到,到最後我們再看看怎麼修正吧

十二點又到啦,休息,明日繼續。


上一篇
Day 15 讀 Go Concurrency Patterns - Rob Pike II
下一篇
Day 17 讀 Go Concurrency Patterns - Rob Pike IV
系列文
golang 後端菜雞工程師學習雜記18
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言