Go channel 的應用場景

channel 適用於數據在多個協程中流動的場景,有很多實際應用:

① 任務定時

比如超時處理:

select {
    case <-time.After(time.Second):

定時任務

select {
    case <- time.Tick(time.Second)

② 解耦生產者和消費者

可以將生產者和消費者解耦出來,生產者只需要往 channel 發送數據,而消費者只管從 channel 中獲取數據。

③ 控制併發數

以爬蟲爲例,比如需要爬取 1w 條數據,需要併發爬取以提高效率,但併發量又不能過大,可以通過 channel 來控制併發規模,比如同時支持 5 個併發任務:

ch := make(chan int, 5)
for _, url := range urls {
  go func() {
    ch <- 1
    worker(url)
    <- ch
  }
}
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/9UhX0g3xStBSzl2zLHnqzA