Golang 執行緒池
阿新 • • 發佈:2018-10-31
經常會用到協程,但是不能一下開那麼多協調,只需要 poolSize 個即可,多了不行。這些個協程在執行完後必須等其完成之後才能進行下一步動作。假定工作方法為 work 。
package main import ( "fmt" "runtime" "sync" "time" ) // WAIT GROUP var wg sync.WaitGroup var IDS_ALL = []int {40,42,43,44,164,166,171,173,174,175,177,518,192,193} func main () { fmt.Println("BEGIN") poolSize := runtime.NumCPU() runtime.GOMAXPROCS(poolSize) ch := make(chan int,poolSize) for _,catid := range IDS_ALL { ch <- 1 wg.Add(1) go work(catid,ch) } wg.Wait() close(ch) fmt.Println("DONE") } // 工作 func work(catid int,ch chan int) { fmt.Println("WORKING ",catid) time.Sleep(2 * 1e9) wg.Done() <-ch }
就是這樣。有問題,但能用。