semaphore 信号量简单实现
下载安装
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)
}

浙公网安备 33010602011771号