Golang线程池gpool

背景

golang中使用并发要考虑很多问题,如控制并发量等待Goroutine执行完毕等。
看下面一段代码:

var wg sync.WaitGroup
count := 10
wg.Add(count)
limitGoroutineCount := make(chan int,5)
for i:=0;i<count;i++{
	go func(a int){
		limitGoroutineCount <- 1
		if time.Now().Second()%4==0{
			wg.Done()
			<- limitGoroutineCount
			return
		}
		fmt.Println(a)
		wg.Done()
		<- limitGoroutineCount
	}(i)
}
wg.Wait()

其实真正的业务代码也就是:

for i:=0;i<count;i++{
	if time.Now().Second()%4==0{
		return
	}
	fmt.Println(a)
}

gpool简介

gpool能做到让开发人员专注业务,而不是满屏的并发相关的代码
gpool代码仓库:https://github.com/GuoFlight/gpool

导入gpool

import "github.com/GuoFlight/gpool"

example

//测试函数
func Test1(a int)int{
    return a
}
func main() {
	//得到进程池对象
	gp := gpool.NewDefault()	//默认最大并发限制为10
	//将函数添加到线程池中
	for i:=0;i<1000;i++{
		err := gp.AddGoroutine(Test1,i)
		if err!=nil{
			fmt.Println(err)
		}
	}
	//执行线程池中的goroutine,默认会阻塞
	gp.Run()
	//得到结果,这里会乱序输出0到999
	for _,v1 := range gp.RetList{
		for _,v2 := range v1{
			fmt.Println(v2)
		}
	}
}

创建gpool对象

使用默认配置:

  • 默认情况下,最大并发限制为10
  • 默认情况下,执行Run方法会阻塞
gp := gpool.NewDefault()

自定义配置:

// 这里相当于gp := gpool.NewDefault()
// 参数1:最大并发数量
// 参数2:执行Run方法是否阻塞
gp := gpool.New(10,true)




那年,郭少在京城。

posted @ 2022-01-03 16:06  NetRookieX  阅读(35)  评论(0编辑  收藏  举报