素手烹茶|Ants - 高性能低损耗的 Goroutine 池
Go 语言最大的特色之一 , 就是其从语言的层面支持并发 。 Go 语言使用了其特有的 goroutine 作为最基本的并发执行单元 , 以协程的方式 , 实现了更加轻量和高效的并发执行 。 然而 , goroutine 缺乏一个高级的管理机制 , 原生情况下使用 , 要实现动态调整数量、内存资源复用、错误处理等 , 往往需要编写比较多的底层代码逻辑 。 Ants , 这个 goroutine 池实现 , 提供了对于大规模 goroutine 的管理功能 , 相比原生实现 , 资源使用率和执行性能都有了很大的提升 。
ants pool
简介Ants , 是 panjf2000 在 github 上开源的高性能 goroutine 池 , 项目位于, 目前版本为 v2.4.0 。 Ants 实现了对于大规模 goroutine 的调度管理和复用 , 允许使用者在开发 Golang 并发程序时限制 goroutine 数量 , 复用资源 , 达到更高效执行任务的效果 。 Ants 提供了大量有用的接口 , 包括:任务提交、获取运行中的 goroutine 数量、动态调整池带下、释放和重启池等 。 Ants 通过优秀的资源复用策略 , 极大地节省内存使用量 , 在大规模批量并发任务场景下 , 比原生的 goroutine 实现的并发具有更高的性能 。
Github项目
安装Ants 使用 Go 语言开发 , 需要 Go 1.8.x 以上 。 Ants 目前同时维护 v1 和 v2 版本 , 安装 v1 版本:
go get -u github.com/panjf2000/ants
v2 版本需要使用 go module 支持 , 开启 GO111MODULE=on:
go get -u github.com/panjf2000/ants/v2
godoc文档
示例Ants 对于任务的执行原理比较直观 , 通过一个工作池的形式维护 goroutine 集合 。 当向工作池提交任务时 , 从池中取出 worker 来执行 。 如果已经存在可用的 goroutine 了 , 那么直接开始执行 , 如果没有 , 则需要判断是否已经达到容量上限 。 如果还没有超过 , 那就意味着可用的 worker 比容量更少 , 此时启动新的 worker 来执行 。 而如果容量已经用完 , 就依据是否为阻塞模式 , 来马上返回 , 或是阻塞等待 。
ants工作池等待
当任务执行完毕 , 对应的 worker 就会得到释放 , 重新回到池中 , 等待下一个任务的调度 , 实现 goroutine 的复用 。
ants复用
完整的工作池 worker 调度的逻辑和流程如下:
ants任务执行流程
Ants 支持不同的使用方式 , 可以直接使用 Submit 接口 , 使用默认配置的工作池完成任务执行 。 Submit 函数的定义如下:
func Submit(task func()) error
通过提供一个函数类型的任务参数 , 来把任务提交到工作池执行 。 我们来看一个简单的使用例子:
package mainimport ( "fmt" "sync" "time" "github.com/panjf2000/ants/v2")func demoFunc() { time.Sleep(10 * time.Millisecond) fmt.Println("Hello World!")}func main() { defer ants.Release() runTimes := 1000 var wg sync.WaitGroup syncCalculateSum := func() {demoFunc()wg.Done() } for i := 0; i
- 素手烹茶|中芯或被“拉黑”要求退出群聊,这是机遇还是无奈?
- 素手烹茶|尘封23年的运钞车劫案告破:嫌犯在部队服役时作案,转业后两获三等功成法官
- 素手烹茶|你知道马云被救了3次吗?
- 素手烹茶|我的电商故事:新手投资25万开天猫店,半年时间赚了100w
- 素手烹茶|腾讯微博将于9月28日停止运营;阿里国内消费者已接近10亿;信通院:5年里5G商用可直接带动信息消费8.2万亿元|Do早报
- 素手烹茶|为什么人们不愿意在通信上花钱?因为运营商不配为之付出更多
- 素手烹茶|爱了!阿里技术官亲笔的Java快速面试指南,熬夜啃完剑指大厂
- 素手烹茶|人工智能:人工的人类智能,还是人工的非人智能?
- 素手烹茶|十铨推出15TB消费级固态,采用QLC闪存
- 素手烹茶|新版头条,怎么听新闻