golang,go,博客,开源,编程

golang每日一库之panjf2000/ants

Published on with 0 views and 0 comments

panjf2000/ants 是一个高性能的 Go 语言协程池(goroutine pool)库,它能够有效管理和复用 goroutine,从而减少高并发场景下 goroutine 的频繁创建与销毁带来的性能开销。ants 通过对 goroutine 进行池化管理,提高了内存使用效率,降低了垃圾回收(GC)压力,适用于需要大量 goroutine 的应用场景,如服务器、爬虫、任务队列等。


核心特性

  1. 自动伸缩ants 会根据任务负载自动调整 goroutine 的数量,以提高资源利用率。
  2. 复用 goroutine:避免频繁创建和销毁 goroutine,减少 GC 压力。
  3. 高性能:相较于原生 goroutine 方案,减少了 CPU 和内存开销,在高并发情况下能有效提升吞吐量。
  4. 任务队列:支持缓冲任务队列,避免 goroutine 阻塞。
  5. 支持超时控制:提供任务超时设置,防止 goroutine 长时间占用资源。
  6. 手动释放资源:可以主动释放 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


适用场景

  1. 高并发服务器:如 Web 服务器、RPC 服务,避免 goroutine 过量创建影响性能。
  2. 爬虫:大量请求任务可以通过 ants 进行调度,减少系统开销。
  3. 定时任务:批量执行任务,避免 goroutine 资源浪费。
  4. 批量计算:如数据处理、日志分析、批量事务处理等。

性能对比

使用 ants 相比直接使用 goroutine,可以显著减少内存使用和 GC 负担。例如,在创建 1 万个任务时:

  • 原生 goroutine:可能占用 100MB+ 内存。
  • ants 协程池:通常仅占用 10MB 内存。

总结

ants 是一个轻量级、高性能的 goroutine 池,适用于需要大量 goroutine 的高并发场景。它能够有效减少 goroutine 频繁创建销毁的开销,提高系统的吞吐量,特别适用于 Web 服务、爬虫、批量任务处理等场景。


标题:golang每日一库之panjf2000/ants
作者:mooncakeee
地址:http://blog.dd95828.com/articles/2025/03/14/1741953949106.html
联系:scotttu@163.com