Golang 线程池
经常会用到协程,但是不能一下开那么多协调,只需要 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 }
就是这样。有问题,但能用。