iT邦幫忙

2021 iThome 鐵人賽

DAY 9
0
自我挑戰組

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

Day 15 讀 Go Concurrency Patterns - Rob Pike II

續上篇 Day 14 讀 Go Concurrency Patterns - Rob Pike I

Restore sequence

基於某種原因,我們有時侯是想要保持順序,也就是 Joe 和 Ann 兩個人各自隨機時間印出 0 , 兩個人在隨幾印出 1,以此類推等等。注意:這和上上一次的例子並不一樣,那一組例子是 Ann 可能已經準備好了,但是必須等 Joe,現在是 Joe 和 Ann 在隨機時間印出之後才等待。

我們可以在 generator (boring function) 傳送的訊息中傳送一個 Message,裏邊放一個 channel,並且用這個 channel 控制是否讓下一輪的 Message 傳送

因此我們將 boring 改寫一下,完整程式在這 link

Using select

還記得 fan in 嗎?兩個 goroutine 同時傳送給一個 channel,快的那個會先送出,這不就跟 select 的意思一樣嗎,select 監聽兩個 channel,兩個 channel 誰先 ready,就走那個 case。那就用 select 改寫吧

Timeout using select

接下來我們來想想,boring generator 要怎麼停止傳送訊息吧。

在 golang 中 timeout 和 select 也很常一起使用。這個的例子是,boring generator 每次發出的訊息間隔不花超過 1 秒,超過的話就 return。

另一種常見的使用方式是,讓 boring function 在一個時間內傳送訊息,以下的例子就是在五秒內傳送訊息,過了五秒後就 return。

Quit channel

我們也可以設計一個 quit channel 通知 boring generator 不要再繼續送訊息

我們通知了 boring generator 著手進行結束的工作,但是我們怎麼知道 boring generator 已經結束了,那就讓 boring generator 結束前通知我吧,完整程式可看 link

今天就到這吧,明天就是這演講的最後一篇。


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

尚未有邦友留言

立即登入留言