美文网首页开发组件
组件分享之后端组件——一个高性能的 goroutine 池ant

组件分享之后端组件——一个高性能的 goroutine 池ant

作者: cn華少 | 来源:发表于2022-04-22 20:16 被阅读0次

    组件分享之后端组件——一个高性能的 goroutine 池ants

    背景

    近期正在探索前端、后端、系统端各类常用组件与工具,对其一些常见的组件进行再次整理一下,形成标准化组件专题,后续该专题将包含各类语言中的一些常用组件。欢迎大家进行持续关注。

    组件基本信息

    内容

    本节我们分享一个高性能的 goroutine 池ants,它实现了对大规模 goroutine 的调度管理、goroutine 复用,允许使用者在开发并发程序的时候限制 goroutine 数量,复用资源,达到更高效执行任务的效果。

    功能:

    • 自动调度海量的 goroutines,复用 goroutines
    • 定期清理过期的 goroutines,进一步节省资源
    • 提供了大量有用的接口:任务提交、获取运行中的 goroutine 数量、动态调整 Pool 大小、释放 Pool、重启 Pool
    • 优雅处理 panic,防止程序崩溃
    • 资源复用,极大节省内存使用量;在大规模批量并发任务场景下比原生 goroutine 并发具有更高的性能
    • 非阻塞机制
    image.png

    使用方式如下:
    1、安装

    go get -u github.com/panjf2000/ants/v2
    

    2、具体使用

    package main
    
    import (
        "fmt"
        "sync"
        "sync/atomic"
        "time"
    
        "github.com/panjf2000/ants/v2"
    )
    
    var sum int32
    
    func myFunc(i interface{}) {
        n := i.(int32)
        atomic.AddInt32(&sum, n)
        fmt.Printf("run with %d\n", n)
    }
    
    func demoFunc() {
        time.Sleep(10 * time.Millisecond)
        fmt.Println("Hello World!")
    }
    
    func main() {
        defer ants.Release()
    
        runTimes := 1000
    
        // Use the common pool.
        var wg sync.WaitGroup
        syncCalculateSum := func() {
            demoFunc()
            wg.Done()
        }
        for i := 0; i < runTimes; i++ {
            wg.Add(1)
            _ = ants.Submit(syncCalculateSum)
        }
        wg.Wait()
        fmt.Printf("running goroutines: %d\n", ants.Running())
        fmt.Printf("finish all tasks.\n")
    
        // Use the pool with a function,
        // set 10 to the capacity of goroutine pool and 1 second for expired duration.
        p, _ := ants.NewPoolWithFunc(10, func(i interface{}) {
            myFunc(i)
            wg.Done()
        })
        defer p.Release()
        // Submit tasks one by one.
        for i := 0; i < runTimes; i++ {
            wg.Add(1)
            _ = p.Invoke(int32(i))
        }
        wg.Wait()
        fmt.Printf("running goroutines: %d\n", p.Running())
        fmt.Printf("finish all tasks, result is %d\n", sum)
    }
    

    更多使用说明,可以参考其官方提供的中文README

    本文声明:
    88x31.png
    知识共享许可协议
    本作品由 cn華少 采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。

    相关文章

      网友评论

        本文标题:组件分享之后端组件——一个高性能的 goroutine 池ant

        本文链接:https://www.haomeiwen.com/subject/nrziertx.html