首页 > 其他 > 详细

semaphore 信号量简单实现

时间:2021-01-22 16:51:46      阅读:29      评论:0      收藏:0      [点我收藏+]

下载安装

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

  

 

semaphore 信号量简单实现

原文:https://www.cnblogs.com/pebblecome/p/14312636.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!