使用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
相关文章
|
3月前
|
并行计算 算法 Java
ForkJoin并行计算神器(史上最全图文详解)
本文详细介绍ForkJoin框架的设计原理、工作窃取算法及使用案例,帮助你更好地利用多处理器并行运算能力提升应用性能。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
ForkJoin并行计算神器(史上最全图文详解)
|
7月前
7-4 sdut-C 语言实验-排队接水问题
7-4 sdut-C 语言实验-排队接水问题
63 0
|
5月前
|
Android开发 开发者 Kotlin
告别AsyncTask:一招教你用Kotlin协程重构Android应用,流畅度飙升的秘密武器
【9月更文挑战第13天】随着Android应用复杂度的增加,有效管理异步任务成为关键。Kotlin协程提供了一种优雅的并发操作处理方式,使异步编程更简单直观。本文通过具体示例介绍如何使用Kotlin协程优化Android应用性能,包括网络数据加载和UI更新。首先需在`build.gradle`中添加coroutines依赖。接着,通过定义挂起函数执行网络请求,并在`ViewModel`中使用`viewModelScope`启动协程,结合`Dispatchers.Main`更新UI,避免内存泄漏。使用协程不仅简化代码,还提升了程序健壮性。
179 1
|
6月前
|
机器学习/深度学习 数据可视化 数据挖掘
为啥我敢说Python是数据分析界的扛把子语言?
为啥我敢说Python是数据分析界的扛把子语言?
63 0
|
7月前
|
Python Windows
从菜鸟到大神:一篇文章带你彻底搞懂Python并发编程——线程篇与进程篇的深度较量!
【7月更文挑战第10天】Python并发编程对比线程与进程。线程适合IO密集型任务,利用`threading`模块,但GIL限制CPU并行。进程适用于CPU密集型任务,通过`multiprocessing`实现,独立内存空间,启动成本高。例子展示了如何创建和管理线程与进程以提高效率。选择取决于任务类型和资源需求。
47 0
|
9月前
|
资源调度 安全 调度
在讨论Python多线程与并发
在讨论Python多线程与并发
36 2
|
9月前
|
安全 Java 程序员
牛皮了!八年美团大佬耗时3月竟在写《java虚拟机并发编程》
除了咖啡因,我想没有什么能比写出一段执行速度飞快的代码更能令程序员们兴奋了。然而我们如何才能满足这种对计算速度的渴求呢?诚然,摩尔定律可以帮我们解决部分问题,但多核处理器才代表了未来真正的发展方向。
|
缓存 Java 程序员
肝到头秃!百度强推并发编程笔记我爱了,原来这才叫并发
随着Java程序员的大幅增长,人们对Java程序员的要求也是越来越严苛。从现在Java岗的招聘需求来看,并发编程已经是我们Java程序员避不开的坎了! 编写正确的程序并不容易,而编写正确的并发程序就更难了。与顺序执行的程序相比,并发程序中显然更容易出现错误。而且并发性错误通常并不会以某种确定的方式显现出来。
|
安全 Java Spring
并发编程-01并发初窥
并发编程-01并发初窥
103 0
|
JSON 缓存 JavaScript
提高系统吞吐量的一把利器:DeferredResult 到底有多强?
提高系统吞吐量的一把利器:DeferredResult 到底有多强?