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...