golang,go,博客,开源,编程
panjf2000/ants
是一个高性能的 Go 语言协程池(goroutine pool)库,它能够有效管理和复用 goroutine,从而减少高并发场景下 goroutine 的频繁创建与销毁带来的性能开销。ants
通过对 goroutine 进行池化管理,提高了内存使用效率,降低了垃圾回收(GC)压力,适用于需要大量 goroutine 的应用场景,如服务器、爬虫、任务队列等。
ants
会根据任务负载自动调整 goroutine 的数量,以提高资源利用率。要在 Go 项目中使用 ants
,可以使用 go get
命令安装:
go get -u github.com/panjf2000/ants/v2
package main
import (
"fmt"
"sync"
"time"
"github.com/panjf2000/ants/v2"
)
func main() {
var wg sync.WaitGroup
// 任务函数
task := func(i int) {
defer wg.Done()
fmt.Printf("执行任务 %d\n", i)
time.Sleep(time.Second) // 模拟任务执行
}
// 创建一个容量为 5 的协程池
pool, _ := ants.NewPool(5)
defer pool.Release()
for i := 0; i < 10; i++ {
wg.Add(1)
_ = pool.Submit(func() { task(i) }) // 提交任务到池中
}
wg.Wait() // 等待所有任务完成
fmt.Println("所有任务执行完成")
}
解析:
5
的 goroutine 池。Submit
提交任务,任务会自动分配给池中的 goroutine 处理。wg.Wait()
确保主协程等待所有任务完成。参数
的协程池如果任务需要参数,ants
允许传递参数:
package main
import (
"fmt"
"sync"
"github.com/panjf2000/ants/v2"
)
func main() {
var wg sync.WaitGroup
// 任务函数
task := func(i interface{}) {
defer wg.Done()
fmt.Printf("任务 %d 正在执行\n", i.(int))
}
// 创建池
pool, _ := ants.NewPoolWithFunc(5, func(i interface{}) {
task(i)
})
defer pool.Release()
for i := 0; i < 10; i++ {
wg.Add(1)
_ = pool.Invoke(i) // 使用 Invoke 传递参数
}
wg.Wait()
fmt.Println("所有任务执行完成")
}
解析:
NewPoolWithFunc
允许传递参数,而不是使用 Submit
。Invoke
方法向 goroutine 传递参数。可以在运行时查看池的状态,如当前 goroutine 数量、池的容量等:
fmt.Printf("当前运行的 goroutine 数量: %d\n", pool.Running())
fmt.Printf("协程池的容量: %d\n", pool.Cap())
当不再使用 ants
时,可以手动释放协程池:
pool.Release()
注意:释放后不能再提交任务,否则会导致 panic
。
ants
进行调度,减少系统开销。使用 ants
相比直接使用 goroutine
,可以显著减少内存使用和 GC 负担。例如,在创建 1 万个任务时:
ants
协程池:通常仅占用 10MB 内存。ants
是一个轻量级、高性能的 goroutine 池,适用于需要大量 goroutine 的高并发场景。它能够有效减少 goroutine 频繁创建销毁的开销,提高系统的吞吐量,特别适用于 Web 服务、爬虫、批量任务处理等场景。