本文分享自天翼云开发者社区《高性能且低成本的 Goroutine 池库-Ants》,作者:李****佳

在 Go 语言中,虽然原生支持并发的 Goroutine 提供了强大的并发能力,但在高并发场景下,无限制地创建 Goroutine 会导致系统资源耗尽。因此,合理管理 Goroutine 的生命周期和数量变得尤为重要。Ants 是一个高性能且低成本的 Goroutine 池库,能够有效解决这些问题。

一、Ants 的优势

Ants 提供了以下关键特性,使其成为高性能 Goroutine 池的理想选择:

  1. 资源复用​:通过复用 Goroutine,减少频繁创建和销毁带来的资源消耗。
  2. 自动调度​:能够高效调度海量 Goroutine,确保并发任务的高效执行。
  3. 优雅处理 Panic​:防止因 Goroutine 中的 Panic 导致程序崩溃。
  4. 性能优化​:相比原生 Goroutine,Ants 在大规模并发任务场景下,吞吐性能提升 2-6 倍,内存消耗减少 10-20 倍。

二、安装与基本使用

安装 Ants 非常简单,只需运行以下命令即可:

bash

安装完成后,就可以在 Go 项目中使用 Ants。

2.1 创建 Goroutine 池

以下是一个简单的示例,展示如何创建一个 Goroutine 池并提交任务:

func main() {
runTask := func(i interface{}) {
fmt.Printf("Running task: %d\n", i.(int))
time.Sleep(1 * time.Second) // 模拟任务处理
} // 创建一个具有 10 个 Goroutines 的池
p, _ := ants.NewPoolWithFunc(10, func(i interface{}) {
runTask(i)
})
defer p.Release() // 提交任务
for i := 0; i < 30; i++ {
_ = p.Invoke(i)
} // 等待所有任务完成
p.Wait()
fmt.Println("All tasks completed")
}
在这个示例中,我们创建了一个包含 10 个 Goroutines 的池,并提交了 30 个任务。Ants 会自动调度这些任务,确保并发数不会超过池的大小。

2.2 提交任务的两种方式

Ants 提供了两种提交任务的方式:

  1. ​**Submit 方法**​:适用于无返回值的任务。
  2. ​**Invoke 方法**​:适用于有返回值的任务。

2.3 动态调整池大小

Ants 支持在运行时动态调整池的大小,这使得 Goroutine 池能够根据实际负载进行灵活调整。

三、高级功能

3.1 非阻塞模式

默认情况下,如果池已满,新任务会阻塞等待。通过设置非阻塞模式,可以避免任务阻塞:

p, _ := ants.NewPoolWithFunc(10, func(i interface{}) {
runTask(i)
}, ants.WithNonblocking(true))
在非阻塞模式下,如果池已满,新任务会立即返回错误。

3.2 任务超时控制

Ants 支持为任务设置超时时间,避免任务长时间占用资源:

p, _ := ants.NewPoolWithFunc(10, func(i interface{}) {
runTask(i)
}, ants.WithExpireDuration(5*time.Second))
在这个示例中,每个任务最多只能运行 5 秒,超过这个时间,任务将被自动终止。

3.3 性能监控

Ants 提供了一些内置的性能监控功能,可以用来观察池的运行状态:

fmt.Printf("Running goroutines: %d\n", pool.Running())
fmt.Printf("Free goroutines: %d\n", pool.Free())
通过这些监控指标,可以更好地了解 Goroutine 池的运行情况。
  • 四、总结

Ants 是一个强大且高效的 Goroutine 池库,通过合理管理 Goroutine 的生命周期和数量,能够显著提升 Go 应用程序的并发性能。无论是简单的并发任务,还是复杂的并发控制,Ants 都提供了强大的支持。

高性能且低成本的 Goroutine 池库-Ants的更多相关文章

  1. Java第三方数据库连接池库-DBCP-C3P0-Tomcat内置连接池

    连接池原理 数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”.预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去.我们可以通过设定连接池 ...

  2. gf框架之grpool - 高性能的goroutine池

    Go语言中的goroutine虽然相对于系统线程来说比较轻量级,但是在高并发量下的goroutine频繁创建和销毁对于性能损耗以及GC来说压力也不小.充分将goroutine复用,减少goroutin ...

  3. Go语言-并发模式-goroutine池实例(work)

    介绍 使用无缓冲的通道来创建一个 goroutine 池,这些 goroutine 执行并控制一组工作,让其并发执行.在这种情况下,使用无缓冲的通道要比随意指定一个缓冲区大小的有缓冲的通道好,因为这个 ...

  4. golang中goroutine池的使用

    1. 概念本质上是生产者.消费者模型可以有效的控制goroutine数量,防止暴涨案例:生成一个随机数,计算该随机数每一个数字相加的和,例如:123:1+2+3=6主协程负责生产数据发送到待处理通道中 ...

  5. Golang(九)简单 Goroutine 池实现

    0. 前言 最近使用 Golang 写一个并发执行的测试脚本 之前习惯使用 Java,习惯性想先建一个线程池.然后意识到 Golang 没有封装好的线程池 结合之前学习的 Goroutine 原理和 ...

  6. Golang 通用连接池库 Golang-Pool

    Golang 实现的连接池 功能: * 连接池中连接类型为interface{},使得更加通用 * 链接的最大空闲时间,超时的链接将关闭丢弃,可避免空闲时链接自动失效问题 * 使用channel处理池 ...

  7. Goroutine并发调度模型深度解析之手撸一个协程池

    golanggoroutine协程池Groutine Pool高并发 并发(并行),一直以来都是一个编程语言里的核心主题之一,也是被开发者关注最多的话题:Go语言作为一个出道以来就自带 『高并发』光环 ...

  8. [开源] gnet: 一个轻量级且高性能的 Golang 网络库

    Github 主页 https://github.com/panjf2000/gnet 欢迎大家围观~~,目前还在持续更新,感兴趣的话可以 star 一下暗中观察哦. 简介 gnet 是一个基于 Ev ...

  9. go中控制goroutine数量

    控制goroutine数量 前言 控制goroutine的数量 通过channel+sync 使用semaphore 线程池 几个开源的线程池的设计 fasthttp中的协程池实现 Start Sto ...

  10. 并发之痛 Thread,Goroutine,Actor

    转自:http://jolestar.com/parallel-programming-model-thread-goroutine-actor/ 先梳理下两个概念,几乎所有讲并发的文章都要先讲这两个 ...

随机推荐

  1. Netty基础—6.Netty实现RPC服务

    大纲 1.RPC的相关概念 2.RPC服务调用端动态代理实现 3.Netty客户端之RPC远程调用过程分析 4.RPC网络通信中的编码解码器 5.Netty服务端之RPC服务提供端的处理 6.RPC服 ...

  2. Docker镜像的内部机制

    Docker镜像的内部机制 镜像就是一个打包文件,里面包含了应用程序还有它运行所依赖的环境,例如文件系统.环境变量.配置参数等等. 环境变量.配置参数这些东西还是比较简单的,随便用一个 manifes ...

  3. Go语言遍历字符串——获取每一个字符串元素

    遍历字符串有下面两种写法. 遍历每一个ASCII字符 遍历 ASCII 字符使用 for 的数值循环进行遍历,直接取每个字符串的下标获取 ASCII 字符,如下面的例子所示. theme := &qu ...

  4. 一文彻底搞清楚ArkUI

    程序员Feri一名12年+的程序员,做过开发带过团队创过业,擅长Java相关开发.鸿蒙开发.人工智能等,专注于程序员搞钱那点儿事,希望在搞钱的路上有你相伴!君志所向,一往无前! 0.前言 在移动开发领 ...

  5. Noise——随机之美

    本篇博文介绍图形学中噪音生成的一般方法. Noise可以干什么? 不规则表面生成 有机体模拟 流体烟雾模拟 甚至是使用noise对灯光强度,位置做扰动: 只有我们想象不到的,没有noise不能涉猎的! ...

  6. 自制一个超级简单的 php 发邮件的轮子 simpleMailTool.php

    simpleMailTool 程序链接 https://github.com/kohunglee/simpleMailTool/ 一个简单的 php 发邮件的轮子,跟其他著名大轮子相比(如 PHPMa ...

  7. BigDecimal类--java进阶day05

    1.BigDecimal出现的原因 2.BigDecimal的创建 不推荐第一种形式,会有误差 第二种方式创建对象 第三种方式调用方法 2.BigDecimal常用方法 除法的特殊事项 如果有除不尽的 ...

  8. java基础之数据结构

    一.栈:stack,又称堆栈[出口和入口在同一侧],特点:先进后出(即,存进去的元素,要在后它后面的元素依次取出后,才能取出该元素) 例子:子弹压进弹夹,先压进去的子弹在下面,后压进去的子弹在上面,当 ...

  9. Java 21 新特性

    Java 21 是 Java 语言的一次重要更新,引入了若干新的特性,提升了开发者的编程效率和代码质量.本文将详细介绍 Java 21 的新特性,包括基础概念.使用方法.常见实践以及最佳实践. 简介 ...

  10. Web前端入门第 33 问:CSS 元素外观常用属性(边框、阴影、轮廓、透明度)

    background 作为元素外观里的重点功臣介绍完毕,本文再一览其他常用的外观属性. 本文示例中,盒子基础样式: .box { font-size: 20px; margin: 20px; padd ...