golang併發channel使用sync.WaitGroup保證所有協程結束並處理額外業務

lightTrace發表於2019-01-09

問題描述

假如一個http請求是很多的陣列id,服務端拿到陣列id去執行業務,但是這個業務執行的時間教長,肯定不能迴圈執行,要讓golang的多協程發揮作用,但是我想對某些id返回的結果做特殊處理,必須保證所有的協程都跑完了才能返回結果,我發現將id放進channel然後多個協程去消費思路是正確的,但是要保證所有的協程精確的跑完,用sync.WaitGroup挺合適的,也許還有更好的辦法,但是這是我目前想的思路。

程式碼

package main

import (
   "fmt"
   "sync"
)

func main() {
   var ch chan int = make(chan int,10)
   var wg sync.WaitGroup
   var balance = [...]int{1,2,3,4,5,6,7,8,9}
    j := 0

   for m:=0;m< len(balance);m++{
      ch <- balance[m]
        wg.Add(1)
   }
   for n:=0;n< len(balance);n++  {
      go func() {
      s := <- ch
        fmt.Println("s ",s)
      if s==4||s==7 {
         j++
      }
      defer wg.Done()
      }()
   }
    wg.Wait()
   fmt.Println("j ",j)
   fmt.Println("執行完畢")
}

每向通道扔進去一個值就wg.Add(1),然後每一個通道的值被消費就 defer wg.Done(),直到為0時,wg.Wait()就不等待了表示所有協程執行結束了。
這樣在最後面就會列印j為2,是正確的結果,當然j++只是一個簡單的業務操作,這裡可以填任意業務邏輯。

相關文章