下载安装
go get -u golang.org/x/sync/semaphore
简单的代码实现
package main import ( "context" "fmt" "golang.org/x/sync/semaphore" "log" "runtime" "time" ) /* 我们创建和 CPU 核数一样多的 Worker,让它们去处理一个 4 倍数量的整数 slice。每个 Worker 一次只能处理一个整数,处理完之后,才能处理下一个。 */ var maxWorkers = runtime.GOMAXPROCS(0) //worker 的数量 var sema = semaphore.NewWeighted(int64(maxWorkers)) //信号量 var task = make([]int,maxWorkers*4) //任务数量 func main() { ctx := context.Background() for i := range task{ //如果没有worker可用,会阻塞在这里,直到某个worker被释放 err := sema.Acquire(ctx,1) if err !=nil{ break } //启动worker goroutine go func(i int) { defer sema.Release(1) time.Sleep(100*time.Millisecond) //模拟一个耗时的操作 task[i] = i+1 }(i) } //请求所有的worker,这样能确保前面的worker都执行完 err := sema.Acquire(ctx,int64(maxWorkers)) if err !=nil{ log.Printf("获取所有的worker失败:%v\n",err) } fmt.Println(maxWorkers) fmt.Println(task) }
原文:https://www.cnblogs.com/pebblecome/p/14312636.html