高性能且低成本的 Goroutine 池库-Ants

天翼云开发者社区
• 阅读 47

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

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

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

​资源复用​:通过复用 Goroutine,减少频繁创建和销毁带来的资源消耗。 ​自动调度​:能够高效调度海量 Goroutine,确保并发任务的高效执行。 ​优雅处理 Panic​:防止因 Goroutine 中的 Panic 导致程序崩溃。 ​性能优化​:相比原生 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 提供了两种提交任务的方式:

Submit 方法​:适用于无返回值的任务。 ​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 都提供了强大的支持。

点赞
收藏
评论区
推荐文章
Easter79 Easter79
3年前
tarsgo初探
参考:https://mp.weixin.qq.com/s/aO8ybUiu5htqcoGAwxwc5Q?utm_sourcetuicool&utm_mediumreferral1、Go的goroutine并发机制使Go非常适合用于大规模高并发后端服务程序的开发2、tars是个开源的微服务平台,包含了一个高性能的rpc框架和服务管理平台
peter peter
4年前
Golang WaitGroup 原理深度剖析
sync.WaitGroup是Golang中常用的并发措施,我们可以用它来等待一批Goroutine结束。WaitGroup的源码也非常简短,抛去注释外也就100行左右的代码。但即使是这100行代码,里面也有着关乎内存优化、并发安全考虑等各种性能优化手段。本文将基于go1.13的源码进行分析,将会涉及以下知识点:1
Wesley13 Wesley13
3年前
go中内存泄露的发现与排查
一,什么是内存泄漏Go中的并发性是以goroutine(独立活动)和channel(用于通信)的形式实现的。处理goroutine时,程序员需要小心翼翼地避免泄露。如果最终永远堵塞在I/O上(例如channel通信),或者陷入死循环,那么goroutine会发生泄露。即使是阻塞的goroutine,也会消耗资源
Wesley13 Wesley13
3年前
100 行写一个 go 的协程池 (任务池)
前言go的goroutine提供了一种较线程而言更廉价的方式处理并发场景,go使用二级线程的模式,将goroutine以M:N的形式复用到系统线程上,节省了cpu调度的开销,也避免了用户级线程(协程)进行系统调用时阻塞整个系统线程的问题。【1】但goroutine太多仍会导致调度性能下降、GC
Wesley13 Wesley13
3年前
Golang处理大数据时使用高效的Pipeline(流水线)执行模型
Golang被证明非常适合并发编程,goroutine比异步编程更易读、优雅、高效。本文提出一个适合由Golang实现的Pipeline执行模型,适合批量处理大量数据(ETL)的情景。想象这样的应用情景:(1)从数据库A(Cassandra)加载用户评论(量巨大,例如10亿条);(2)根据每条评论的用户ID、从数据库B(MySQL)关联用户资
Stella981 Stella981
3年前
Goroutine并发调度模型深入之实现一个协程池
并发(并行),一直以来都是一个编程语言里的核心主题之一,也是被开发者关注最多的话题;Go语言作为一个出道以来就自带『高并发』光环的富二代编程语言,它的并发(并行)编程肯定是值得开发者去探究的,而Go语言中的并发(并行)编程是经由goroutine实现的,goroutine是golang最重要的特性之一,具有使用成本低、消耗资源低、能效高等特点,官方宣称
Stella981 Stella981
3年前
Goroutine并发调度模型深度解析&手撸一个协程池
并发(并行),一直以来都是一个编程语言里的核心主题之一,也是被开发者关注最多的话题;Go语言作为一个出道以来就自带『高并发』光环的富二代编程语言,它的并发(并行)编程肯定是值得开发者去探究的,而Go语言中的并发(并行)编程是经由goroutine实现的,goroutine是golang最重要的特性之一,具有使用成本低、消耗资源低、能效高等特点,官方宣称
Stella981 Stella981
3年前
Go中的并发编程和goroutine
并发编程对于任何语言来说都不是一件简单的事情。Go在设计之初主打高并发,为使用者提供了goroutine,使用的方式虽然简单,但是用好却不是那么容易,我们一起来学习Go中的并发编程。1\.并行和并发并行(parallel):指在同一时刻,有多条指令在多个处理器上同时执行。并发(concurrency):指在
Stella981 Stella981
3年前
Golang学习笔记:goroutine
1.goroutinegoroutine是go语言的并发体。在go语言里面能使用go关键字来实现并发。gofunc()1.1概念介绍goroutine本质上是协程,我刚刚学习的时候就粗略地认为goroutine是线程,直到最近才开始搞明白goroutine的基本概念。<fon
Stella981 Stella981
3年前
Golang 中的并发限制与超时控制
前言上回在 用Go写一个轻量级的ssh批量操作工具(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.jianshu.com%2Fp%2F7d315f8551ad) 里提及过,我们做Golang并发的时候要对并发进行限制,对goroutine的执行要有超
天翼云开发者社区
天翼云开发者社区
Lv1
天翼云是中国电信倾力打造的云服务品牌,致力于成为领先的云计算服务提供商。提供云主机、CDN、云电脑、大数据及AI等全线产品和场景化解决方案。
文章
836
粉丝
16
获赞
40