github地址: https://github.com/panjf2000/ants
ants是一个高性能的 goroutine 池,实现了对大规模 goroutine 的调度管理、goroutine复用,允许使用者在开发并发程序的时候限制goroutine数量,复用资源,达到更高效执行任务的效果。
package main
import (
"fmt"
"sync"
"sync/atomic"
"time"
"github.com/panjf2000/ants/v2"
)
var sum int32
func myFunc(i interface{}) int32 {
n := i.(int32)
atomic.AddInt32(&sum, n)
return n
}
func demoFunc() {
time.Sleep(10 * time.Millisecond)
fmt.Println("Hello World!")
}
func main() {
// ants库中定义了一个默认的池,默认容量为MaxInt32, 使用的使用可以不用再New, 但是默认池也需要Release()
defer ants.Release()
runTimes := 1000
// Use the common pool.
var wg sync.WaitGroup
syncCalculateSum := func() {
demoFunc()
wg.Done()
}
for i := 0; i < runTimes; i++ {
wg.Add(1)
_ = ants.Submit(syncCalculateSum)
}
wg.Wait()
fmt.Printf("running goroutines: %d\n", ants.Running())
fmt.Printf("finish all tasks.\n")
// 控制goroutine池的容量
p, _ := ants.NewPoolWithFunc(10, func(i interface{}) {
// 获取返回结果
ret := myFunc(i)
fmt.Printf("result= %d\n", ret)
wg.Done()
})
defer p.Release()
// 提交任务
for i := 0; i < runTimes; i++ {
wg.Add(1)
_ = p.Invoke(int32(i))
}
wg.Wait()
fmt.Printf("running goroutines: %d\n", p.Running())
fmt.Printf("finish all tasks, result is %d\n", sum)
}
输出:
running goroutines: 1000
finish all tasks.
....
running goroutines: 10
finish all tasks, result is 499500
Exiting.
下面看一下官方提供的goroutine池的配置项:
go ants池秉承了go简单,高效的设计理念, 看上去完成的功能不少, 但核心代码却不超过1000行, go ants执行速度比没有池的 goroutine 快 2~6 倍,内存消耗减少 10 到 20 倍, 非常值得大家好好去阅读一番.
参考: https://cloud.tencent.com/developer/article/2045822