Synopsis
- sync 有幾種類型 : WaitGroup, Mutex, RWMutex, Pool, Once, Cond, Map
- 而何時需要用到 sync.Mutex?
- 如果我們不需要溝通怎麼辦? 如果我們只是想確保一次只有一個 goroutine 可以一次訪問一個變量以避免衝突該怎麼辦?
- 可以用 sync.Mutex
- 但其實一樣可以把變數塞到 channel 解決相同的問題
- 如果我們不需要溝通怎麼辦? 如果我們只是想確保一次只有一個 goroutine 可以一次訪問一個變量以避免衝突該怎麼辦?
- 關於 channel 的應用模式: [Lock/TryLock 模式, Or Channel 模式, Or-Done-Channel模式, Fan-in, Tee模式, 分布模式, eapache]
- channel 的用途就是在於『讓多個 goroutine 互相溝通,不會產生重複取物件的問題』
- Do not communicate by sharing memory; instead, share memory by communicating.
- goroutine + channel 可以做到同步/異步的功能, 透過 channel 來讓多個 goroutine 互相溝通(也就是不會取到相同的值)
sync.Mutex{} example
- 使用 sync.Mutex 模擬 Lock, Unlock 使用行為
1 |
|
channel example(一)
- 透過 channel 模擬 lock, unlock 行為
1 |
|
channel example(二)
- 規則
- 模擬阻塞跟非組塞的狀態
- 建立一個 ping 單位, 透過
pingTimeMillisecond
來模擬要求的速度 - 建立五個 pong 單位, 透過
pongTimeMillisecond
來模擬回應的速度 - 透過
c:=make(chan int, 5)
, 來暫存接收且暫存的任務(當處理的 goroutine 來不及處理時)
- 流程說明
- 也就是當 ping 的速度過快,讓 c 來不及暫存的時候,就會產生組塞的動作
- 當阻塞的狀況發生,在 web 上就會發生請求逾時
1 |
|