golang中channel的應用場景

2022-09-21 23:51:10 字數 1494 閱讀 9000

channel+goroutine是go併發的大殺器

channel可以用來停止訊號(傳送訊號停止子goroutine的執行)

超時控制(websocket中長時間不活躍的使用者可以直接斷開鏈結)

定時任務的執行

解耦生產方和消費方

控制最大併發數量

案例見下面:

* channel和goroutine的結合是go併發程式設計的大殺器

* 而channel和select、cancel、timer的結合能實現各種各樣的功能

* 1. 停止訊號:關閉channel或向channel傳送乙個元素,使接收方通過channel獲得資訊後做相應的操作

* 2. 任務定時:

(1)超時控制

func main() ()

select

out <- true

}()<-out

}

(2)定期執行某個任務
func main() 

}}

3. 解耦生產方和消費方

服務啟動時,啟動n個worker,作為工作協程池,這些協程工作在乙個for無限迴圈裡, 從某個channel消費工作任務並執行

案例:

func main() 

select

}func workertask(taskschan chan int)

}(i)

}}

輸出結果:

finish task: 1 by worker 4

finish task: 2 by worker 1

finish task: 3 by worker 2

finish task: 4 by worker 3

finish task: 0 by worker 0

finish task: 5 by worker 0

finish task: 6 by worker 1

finish task: 7 by worker 3

finish task: 8 by worker 2

finish task: 9 by worker 4

4. 控制併發數

有時需要定時執行幾百個任務,例如每天定時按城市來執行一些離線計算的任務。但是併發數又不能太高,

因為任務執行過程依賴第三方的一些資源,對請求的速率有限制。這時就可以通過 channel 來控制併發數。

案例:

var limit = make(chan int, 3)

func main()

for i, v := range tasks (i, v)

} time.sleep(time.second * 4)

}

golang中channel的用法

go語言的range迴圈可以直接在channels上面迭代。使用range迴圈一次從channel中接受資料,當channel被關閉並且沒有值可接受時跳出循壞。func main close natures go func close squares for x range squares 雙向ch...

golang中channel的用法

channel有點類似於管道,它在goroutine同步與通訊中,有著起承轉合的作用,同時也是golang實現csp模型的關鍵 package main func main 以下是channel的一些使用場景 等待goroutine完成 package main func main println ...

golang中channel的用法

給 個 nil channel 傳送資料,造成永遠阻塞 從 個 nil channel 接收資料,造成永遠阻塞 給 個已經關閉的 channel 傳送資料,引起 panic 從 個已經關閉的 channel 接收資料,如果緩衝區中為空,則返回 個零值 緩衝的channel是同步的,有緩衝的chann...