ants
ants库是一个利用到了池化技术的goroutine库,它实现了对大量goroutine的自动调度、复用、定期清理过期的goroutines、可以在创建池的时候限制goroutine的数量,复用资源,从而可以高效的执行任务。
提供如下接口
-
获取运行中的 goroutine 数量
-
动态调整 Pool 大
-
释放 Pool
-
重启 Pool
pool.go提供了ants.NewPool(创建协程池)、
创建Pool对象需调用ants.NewPool(size, options)函数,返回一个pool的指针
在NewPool中lock,其实给lock初始化了一个自旋锁,这里是利用atomic.CompareAndSwapUint32()这个原子操作实现的,在加锁失败后不会等待,而是继续尝试,提高了加锁减锁的性能
Submit(task func())提交任务
传进去的是任务函数
package main
import (
"fmt"
"sync"
"time"
"github.com/panjf2000/ants"
)
func Task() {
fmt.Println("Hello,This is a tesk")
time.Sleep(2 * time.Second)
}
var wg sync.WaitGroup
func main() {
pool, _ := ants.NewPool(5)
defer pool.Release()
task := func() {
Task()
wg.Done()
}
for i := 0; i < 10; i++ {
wg.Add(1)
pool.Submit(task)
}
wg.Wait()
}