Go 语言的高性能协程池 ants

Go 语言的高性能协程池 ants

MIT
Google Go 查看源码»
跨平台
2018-07-02
潘少online

github主页:https://github.com/panjf2000/ants

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

功能

1. 实现了自动调度并发的goroutine,复用goroutine
2. 提供了友好的接口:任务提交、获取运行中的协程数量、动态调整协程池大小
3. 资源复用,极大节省内存使用量;在大规模批量并发任务场景下比原生goroutine并发具有更高的性能

使用

写 go 并发程序的时候如果程序会启动大量的 goroutine ,势必会消耗大量的系统资源(内存,CPU),通过使用 ants,可以实例化一个协程池,复用 goroutine ,节省资源,提升性能:

package main

import (
"fmt"
"sync"
"sync/atomic"

"github.com/panjf2000/ants"
"time"
)

var sum int32

func myFunc(i interface{}) error {
n := i.(int)
atomic.AddInt32(&sum, int32(n))
fmt.Printf("run with %d\n", n)
return nil
}

func demoFunc() error {
time.Sleep(10 * time.Millisecond)
fmt.Println("Hello World!")
return nil
}

func main() {
runTimes := 1000

// use the common pool
var wg sync.WaitGroup
for i := 0; i < runTimes; i++ {
wg.Add(1)
ants.Submit(func() error {
demoFunc()
wg.Done()
return nil
})
}
wg.Wait()
fmt.Printf("running goroutines: %d\n", ants.Running())
fmt.Printf("finish all tasks.\n")

// use the pool with a function
// set 10 the size of goroutine pool
p, _ := ants.NewPoolWithFunc(10, func(i interface{}) error {
myFunc(i)
wg.Done()
return nil
})
// submit tasks
for i := 0; i < runTimes; i++ {
wg.Add(1)
p.Serve(i)
}
wg.Wait()
fmt.Printf("running goroutines: %d\n", p.Running())
fmt.Printf("finish all tasks, result is %d\n", sum)
}
的码云指数为
超过 的项目
加载中

评论(7)

潘少online
潘少online 软件作者
关于性能对比和其他更详细的信息可以到github上看:https://github.com/panjf2000/ants
Eriloan
Eriloan
抛开Go的哲学功特性,这个的应用场景是什么?
爽歪歪ES
golang不推荐池化协程
青衫柏箴
青衫柏箴
为什么我觉得没有必要呢
没有头像也是一种帅
没有头像也是一种帅
有点乱啊
w
wppiwyye
请问有性能的对比吗?
y
yllbaiwei
提交任务时,能否设置超时时间?

暂无资讯

暂无问答

11 个 Visual Studio 代码性能分析工具

软件开发中的性能优化对程序员来说是一个非常重要的问题。一个小问题可能成为一个大的系统的瓶颈。但是对于程序员来说,通过自身去优化代码是十分困难的。幸运的是,有一些非常棒的工具可以帮...

2015/07/23 15:11
127
0
《Visual Studio Magazine》2013年读者选择奖—软件类

《Visual Studio Magazine》会在每年的下半年向读者发出投票邀请,读者将在28个大类,超过500个开发工具的名单中选出他们认为最好的产品,以票数评出各分类的金、银、铜奖。近日,《Visual ...

2013/10/11 17:10
25
0
Goroutine并发调度模型深度解析&手撸一个协程池

并发(并行),一直以来都是一个编程语言里的核心主题之一,也是被开发者关注最多的话题;Go语言作为一个出道以来就自带 『高并发』光环的富二代编程语言,它的并发(并行)编程肯定是值得开...

2018/07/01 09:05
39
0
.Net Core 2.0 + CentOS 7 + Nginx(编译发布)

发布篇: CentOs 6.5 安装 MySql (本地测试,能用为主) 【传送门】 CentOS 7 安装 .Net Core (CentOS 6.5太坑,放弃了) CentOS 7 IP配置 ip a 查看网卡名称,对应修改(参考) TYPE=Ethernet...

2018/01/11 11:50
183
0
蚂蚁爬行问题

问题主题:Ants(POJ No.1852) 问题描述: n只蚂蚁以每秒1cm的速度在长为Lcm的竹竿上爬行。当蚂蚁看到竿子的端点时就会落下来。由于竿子太细,两只蚂蚁相遇时,它们不能交错通过,只能各自反方...

2015/01/10 13:57
12
0
蚂蚁爬行问题

问题主题:Ants(POJ No.1852) 问题描述: n只蚂蚁以每秒1cm的速度在长为Lcm的竹竿上爬行。当蚂蚁看到竿子的端点时就会落下来。由于竿子太细,两只蚂蚁相遇时,它们不能交错通过,只能各自反方...

2015/01/10 13:57
8
0
WPF -.Net 4.0解决了DataGrid分组时的内存泄露

阅读: 1324 评论: 10 作者: 周 金根 发表于 2010-05-20 14:43 原文链接   在OpenExpressApp中框架自带一个【部门管理】模块,其中【功能权限】设置时用了DataGrid,并且使用了DataGrid的分...

2010/06/02 22:36
240
0
ant 打包android项目,引用第三方library,多版本,多渠道

ant 打包android项目,引用第三方library,多版本,多渠道

2016/02/29 16:45
31
1

没有更多内容

加载失败,请刷新页面

返回顶部
顶部