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)
}

  

 

posted @ 2021-01-22 12:32  pebblecome  阅读(90)  评论(0)    收藏  举报