使用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
相关文章
|
11月前
|
安全 Java
并发编程系列教程(完) - 终章总结
并发编程系列教程(完) - 终章总结
43 0
|
28天前
高性能并行编程与优化 | 第02讲回家作业
本文是关于高性能并行编程与优化课程的第二讲回家作业,包括作业要求、初始运行结果、抄的答案以及改进后的运行结果。作业内容涉及对双链表类`List`的修改,要求避免不必要的拷贝、修复智能指针问题、实现深拷贝构造函数、解释为什么可以删除拷贝赋值函数以及改进`Node`的构造函数。同时,还提供了如何提交作业、设置https代理的链接以及评分规则。
高性能并行编程与优化 | 第02讲回家作业
|
28天前
高性能并行编程与优化 | 第03讲回家作业
本文是关于高性能并行编程与优化课程的第三讲回家作业,包括题目要求、代码答案抄写以及成功运行的截图。
高性能并行编程与优化 | 第03讲回家作业
|
28天前
|
C++
高性能并行编程与优化 | 第01讲回家作业
本文是关于高性能并行编程与优化的回家作业,涉及CMake错误解决、编译问题处理、代码和编译结果分享、使用方法说明以及躺坑记录。
高性能并行编程与优化 | 第01讲回家作业
|
28天前
|
算法 编译器
高性能并行编程与优化 | 第04讲回家作业
本文是关于高性能并行编程与优化课程的第四讲回家作业,包括作业要求、原始代码运行结果、优秀的代码答案以及优化后的运行结果和解析。作业目标是利用所学知识优化多体引力求解器的代码,要求不能使用多线程并行和算法复杂度优化,但可以通过编译器和平台优化来提升性能。
高性能并行编程与优化 | 第04讲回家作业
|
2月前
|
Shell Python
Python多线程怎么做?
Python 3 中利用 `threading` 模块实现多线程。创建与执行线程有两种常见方式:一是直接使用 `Thread` 类实例,指定目标函数;二是通过继承 `Thread` 类并重写 `run` 方法。前者构造 `Thread` 对象时通过 `target` 参数指定函数,后者则在子类中定义线程的行为。两种方式均需调用 `start` 方法启动线程。示例展示了这两种创建线程的方法及输出顺序,体现线程并发执行的特点。
|
5月前
|
设计模式 监控 安全
Java多线程编程优化实践
本文将探讨在Java多线程编程中如何进行优化实践,通过合理的设计和技巧,提高程序性能、避免常见的问题。从线程池的使用、锁的选择到并发数据结构的应用,全面介绍优化多线程编程的方法与技巧。
|
缓存 并行计算 算法
Python多线程与多进程教程:全面解析、代码案例与优化技巧
Python多线程与多进程教程:全面解析、代码案例与优化技巧
493 0
|
Web App开发 前端开发 JavaScript
前端性能优化之Performance神器
 对Chrome控制台有一定的了解的朋友都在知道,Network面板会包括很多网络请求方面的东西,包括Http相关的Request信息,Response信息,以及Cookies等等,都是前端开发需要密切关注的问题。
前端性能优化之Performance神器
|
测试技术
ABAP 并发执行的威力
Sent: Thursday, 28 January, 2016 7:21 PM
110 0
ABAP 并发执行的威力