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)
那年,郭少在京城。