golang并发(同步)多任务高性能执行&聚合

2024-06-04 8486阅读

taskgroup

golang并发执行多任务(网络i/o、磁盘i/o、内存i/o等),并聚合收集多任务执行结果与执行状态(如任务组执行失败,返回首个必要成功任务的错误信息, 且会立即停止后续任务的运行)。

使用文档、 项目github

使用: go get github.com/mlee-msl/taskgroup

功能特点

  • 并发安全的执行多个任务
  • 将多个任务的执行结果与执行状态进行聚合
  • 通过扇出/扇入模式,结合线程安全channel实现高效协程间通信
  • 多任务复用(共享)同一协程,避免了因协程频繁创建或销毁带来的开销,一定程度上也减少了上下文切换(特别是,内核线程与用户协程间的切换)的频次
  • early-return,当出现必要成功的任务失败时,停止执行所有goroutine后续的其他任务

    vs官方扩展库errgroup

    • errgroup 没有任务添加阶段,直接会使用协程执行指定的任务

      可通过限制协程数量上限,控制并发量(指定buffer size的channel实现),当协程数达到上限时,需要等待现有任务执行结束,然后开启新的协程,会增加协程创建或销毁的成本

      另外,当协程量不指定时(默认协程量不受限),随着任务量的增加,会增加内核态线程与用户态协程间的上下文切换成本

    • errgroup可支持带有取消Context的模式,但实际上,该种模式下仍需要所有执行任务的goroutine执行完毕(每个任务都会绑定到新的goroutine上)
    • 仅返回了首个出现错误的接口(任务)状态,未将所有接口(任务)的执行结果(或执行状态)进行收集

      性能

      • cpu性能

        go test -benchmem -run=^$ -bench ^BenchmarkTaskGroupHigh$ -cpu='1,2,4,8,16' -benchtime=10x -count=5 -cpuprofile='cpu.pprof' .

      • 内存性能

        go test -benchmem -run=^$ -bench ^BenchmarkTaskGroupHigh$ -cpu='1,2,4,8,16' -benchtime=10x -count=5 -memprofile='mem.pprof' .

      • 阻塞性能

        go test -benchmem -run=^$ -bench ^BenchmarkTaskGroupHigh$ -cpu='1,2,4,8,16' -benchtime=10x -count=5 -blockprofile='block.pprof' .

      • 锁性能

        go test -benchmem -run=^$ -bench ^BenchmarkTaskGroupHigh$ -cpu='1,2,4,8,16' -benchtime=10x -count=5 -mutexprofile='mutex.pprof' .

        其他

        • 核心功能的测试用例均采用Fuzz Test模糊测试,并测试通过,模糊测试用例
        • 包中提供的核心功能,均有Example Test样例用例,并执行通过,样例用例

          关于

          • 欢迎大家对 项目github 进行star、fork
          • 欢迎大家积极共建,提一切可能的Issues,进行PR(MR)

    免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

    目录[+]