使用ants并发任务,事半功倍

简介: 使用ants并发任务,事半功倍

使用ants并发,事半功倍



简介


ants是一个高性能的goroutine池,实现了对大规模goroutine的调度管理、goroutine复用,允许使用者在开发并发程序的时候限制goroutine数量,复用资源,达到更高效执行任务的效果。


功能


  • 自动调度海量的goroutines,复用goroutines
  • 定期清理过期的goroutines,进一步节省资源
  • 提供了大量有用的接口:任务提交、获取运行中的goroutine数量、动态调整Pool大小、释放Pool、重启Pool
  • 优雅处理panic,防止程序崩溃
  • 资源复用,极大节省内存使用量;在大规模批量并发任务场景下比原生goroutine并发具有更高的性能
  • 非阻塞机制


如何运行


流程图:

640.png


示意图:

640.png


刚开始Goroutine Pool中有四个Worker,然后当前有六个Task任务。

然后程序运行起来之后,每个Worker绑定一个Task开始工作,剩余两个Task在等待被调度。

只要Worker有空闲的就会Fetch一个Task开始Running

所有的Task执行完成之后,Worker有收回进Goroutine Pool中。


安装


  • 使用ants v1版本:

go get -u github.com/panjf2000/ants

  • 使用ants v2版本 (开启 GO111MODULE=on):

go get -u github.com/panjf2000/ants/v2


使用


go 发程序的时候如果程序会启动大量的goroutine,势必会消耗大量的系统资源(内存,CPU),通过使用ants,可以实例化一个goroutine池,复用goroutine,节省资源,提升性能。


  1. 初始化一个Pool
package pool
import (
 "github.com/panjf2000/ants"
 "sync"
)
var (
 pool *ants.Pool
 once sync.Once
)
func InitPool(size int) {
 once.Do(func() {
  var err error
  pool, err = ants.NewPool(size)
  if err != nil {
   panic(err)
  }
 })
}
func GetPool() *ants.Pool {
 return pool
}


然后在main.go中使用:


func main() {
     // 初始化goroutine池
     pool.InitPool(100)
     pool.GetPool().Submit(func() {
            fmt.Println("task1")
        })
      pool.GetPool().Submit(func() {
            fmt.Println("task2")
        })
      pool.GetPool().Submit(func() {
            fmt.Println("task3")
        })
       pool.GetPool().Submit(func() {
            fmt.Println("task4")
        })
      select{}
}


额外说明


  1. Pool创建之后,程序退出的时候得释放pool.Release()
  2. 也可以重启Poolpool.Reboot()// 只要调用 Reboot() 方法,就可以重新激活一个之前已经被销毁掉的池,并且投入使用。
  3. Pool有自己的一些配置,比如PreAlloc预分配,Logger以及Nonblocking等,详细请参考官网:https://github.com/panjf2000/ants/blob/dev/README_ZH.md
相关文章
|
Go 调度 机器学习/深度学习
|
存储 Web App开发 Go
使用Golang上传文件到MinIO对象存储(一)
前一篇文章介绍了开源存储系统 MinIO 的基本内容,今天我们就来看一下,如何使用 Golang 语言将本地的文件上传到 MinIO 对象存储服务上。
3280 2
|
8月前
|
数据采集 安全 Go
Conc,一个神奇的Go语言并发利器!
`sourcegraph/conc` 是 Go 语言的结构化并发工具包,提供 `conc.WaitGroup`、goroutine 池和上下文管理等功能,帮助开发者安全高效地处理并发任务,避免 goroutine 泄漏、简化错误处理,提升代码可读性与程序健壮性。
353 0
Conc,一个神奇的Go语言并发利器!
|
存储 监控 NoSQL
MongoDB索引解析:工作原理、类型选择及优化策略
MongoDB索引解析:工作原理、类型选择及优化策略
|
存储 缓存 安全
Go 语言中的 Sync.Map 详解:并发安全的 Map 实现
`sync.Map` 是 Go 语言中用于并发安全操作的 Map 实现,适用于读多写少的场景。它通过两个底层 Map(`read` 和 `dirty`)实现读写分离,提供高效的读性能。主要方法包括 `Store`、`Load`、`Delete` 等。在大量写入时性能可能下降,需谨慎选择使用场景。
|
负载均衡 网络协议 安全
slb多站点或多域名部署
slb多站点或多域名部署
493 4
|
Linux Go 开发工具
Golang各平台环境搭建实战
这篇文章详细介绍了如何在Windows、Linux和Mac平台上搭建Golang开发环境,包括下载和安装Go SDK、配置环境变量、安装开发工具如Visual Studio Code和Go扩展,以及如何编写和运行第一个Go程序。
1075 3
|
Java Apache Spring
Java发送Http请求(HttpClient)
Java发送Http请求(HttpClient)
13352 2
|
网络协议 Linux iOS开发
|
存储 算法 Java
加密解密(3DES)DES的加强版
加密解密(3DES)DES的加强版