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

功能:

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

安装

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

使用包管理工具 glide 安装:

1glide get github.com/panjf2000/ants

使用

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

1package main
2
3import (
4    "fmt"
5    "sync"
6    "sync/atomic"
7
8    "github.com/panjf2000/ants"
9    "time"
10)
11
12var sum int32
13
14func myFunc(i interface{}) error {
15    n := i.(int)
16    atomic.AddInt32(&sum, int32(n))
17    fmt.Printf("run with %d\n", n)
18    return nil
19}
20
21func demoFunc() error {
22    time.Sleep(10 * time.Millisecond)
23    fmt.Println("Hello World!")
24    return nil
25}
26
27func main() {
28    runTimes := 1000
29
30    // use the common pool
31    var wg sync.WaitGroup
32    for i := 0; i < runTimes; i++ {
33        wg.Add(1)
34        ants.Submit(func() error {
35            demoFunc()
36            wg.Done()
37            return nil
38        })
39    }
40    wg.Wait()
41    fmt.Printf("running goroutines: %d\n", ants.Running())
42    fmt.Printf("finish all tasks.\n")
43
44    // use the pool with a function
45    // set 10 the size of goroutine pool
46    p, _ := ants.NewPoolWithFunc(10, func(i interface{}) error {
47        myFunc(i)
48        wg.Done()
49        return nil
50    })
51    // submit tasks
52    for i := 0; i < runTimes; i++ {
53        wg.Add(1)
54        p.Serve(i)
55    }
56    wg.Wait()
57    fmt.Printf("running goroutines: %d\n", p.Running())
58    fmt.Printf("finish all tasks, result is %d\n", sum)
59}

任务提交

提交任务通过调用 ants.Submit(func())方法:

1ants.Submit(func() {})

自定义池

ants支持实例化使用者自己的一个 Pool ,指定具体的池容量;通过调用 NewPool 方法可以实例化一个新的带有指定容量的 Pool ,如下:

1// set 10000 the size of goroutine pool
2p, _ := ants.NewPool(10000)
3// submit a task
4p.Submit(func() {})

动态调整协程池容量

需要动态调整协程池容量可以通过调用ReSize(int):

1pool.ReSize(1000) // Readjust its capacity to 1000
2pool.ReSize(100000) // Readjust its capacity to 100000

该方法是线程安全的。

Benchmarks

系统参数:

1OS : macOS High Sierra
2Processor : 2.7 GHz Intel Core i5
3Memory : 8 GB 1867 MHz DDR3

BenchmarkGoroutine-4 代表原生goroutine

BenchmarkPoolGroutine-4 代表使用协程池ants

Benchmarks with Pool

Benchmarks with PoolWithFunc

吞吐量测试

10w 任务量

100w 任务量

1000w 任务量

1000w任务量的场景下,我的电脑已经无法支撑 golang 的原生 goroutine 并发,所以只测出了使用ants池的测试结果。

原文发布时间为:2018-06-27

本文来自云栖社区合作伙伴“Golang语言社区”,了解相关信息可以关注“Golang语言社区”。

推荐很好用的Goroutine连接池相关推荐

  1. 几个主流的Java连接池整理

    池(Pool)技术在一定程度上可以明显优化服务器应用程序的性能,提高程序执行效率和降低系统资源开销.这里所说的池是一种广义上的池,比如数据库连接池.线程池.内存池.对象池等.其中,对象池可以看成保存对 ...

  2. (十二)C3P0连接池使用教程

    一般我们在项目中操作数据库时,都是每次需要操作数据库就建立一个连接,操作完成后释放连接.因为jdbc没有保持连接的能力,一旦超过一定时间没有使用(大约几百毫秒),连接就会被自动释放掉.而每次新建连接都 ...

  3. Golang 连接池的几种实现案例

    因为TCP的三只握手等等原因,建立一个连接是一件成本比较高的行为.所以在一个需要多次与特定实体交互的程序中,就需要维持一个连接池,里面有可以复用的连接可供重复使用. 而维持一个连接池,最基本的要求就是 ...

  4. Golang连接池的几种实现案例

    因为TCP的三次握手等等原因,建立一个连接是一件成本比较高的行为.所以在一个需要多次与特定实体交互的程序中,就需要维持一个连接池,里面有可以复用的连接可供重复使用. 而维持一个连接池,最基本的要求就是 ...

  5. c3p0连接池的配置和简单使用

    背景 一般我们在项目中操作数据库时,都是每次需要操作数据库就建立一个连接,操作完成后释放连接.因为jdbc没有保持连接的能力,一旦超过一定时间没有使用(大约几百毫秒),连接就会被自动释放掉.而每次新建 ...

  6. C3P0连接池配置方式

    c3p0的配置方式分为三种,分别是  1.setters一个个地设置各个配置项  2.类路径下提供一个c3p0.properties文件  3.类路径下提供一个c3p0-config.xml文件 1. ...

  7. C3P0 连接池获取的connection执行close() 方法是销毁连接还是释放资源归还连接至连接池?

    C3P0 连接池获取的connection执行close() 方法是释放资源销毁连接还是释放资源归还连接至连接池? 如果你只是想要一个答案的话,可以很明确的说: 连接池的连接对象在执行clos()方法 ...

  8. MyBatis进阶七:MyBatis整合C3P0连接池;

    Mybatis整合其他连接池,本篇博客以整合C3P0连接池为例. 目录 MyBatis整合C3P0连接池的步骤: (1)第一步:通过maven引入C3P0的依赖: (2)第二步:创建C3P0和Myba ...

  9. SpringBoot 官方强烈推荐,连接池,太快了!

    大家好,现在介绍一款非常强大,高效,并且号称"史上最快连接池".由此可见他是有多受人喜欢,并且在SpringBoot2.0之后,采用的默认数据库连接池就是Hikari. 我们知道的 ...

最新文章

  1. Jenkins首次安装推荐插件出错 No such plugin: cloudbees-folder 超详细解决方案
  2. 动态规划 | 对输入进行hash处理的LIS 1045
  3. HLG2040二叉树遍历已知前中,求后
  4. todolist实现删除的功能_coc-todolist: nvim/vim 的 todolist/task 管理插件
  5. GooglePerformanceTools--tcmalloc
  6. videoleap怎么导出本地_Pr导出视频时,如何调节视频文件大小?
  7. 举例说明html语言的结构,第2章、HTML语言的基本结构.doc
  8. 以下可以作为C语言标识符的是( ),天津市计算机二级C语言选择题
  9. NetFramework3.5 win10 64位 32位 安装资源——免费下载
  10. php 泛型编程,泛型是什么,C++泛型编程又是什么?
  11. 视频动作识别调研(Action Recognition)
  12. 在linux下比较好用的chm阅读器和飞信软件
  13. c++重写卷积网络的前向计算过程,复现theano的测试结果
  14. mysql8.0安装设置密码_mysql8.0.11安装配置方法图文教程 MySQL8.0新密码认证方式
  15. 纯CSS+HTML绘制小猪佩奇---泥腿子前端出品
  16. 继承2019.06.13
  17. 经验:EXCEL生成y=kx+b函数图,有x,y原始数据,求平均系数k
  18. 北大青鸟培训第第二周第一天:HTML和CSS相关知识 (持续更新)
  19. 微信公众号挂号系统,处方笺功能全新上线 民营门诊看过来
  20. 新生研讨课报告——图片处理在电影特效制作中的应用

热门文章

  1. 深入理解Date对象
  2. 计算机图形学研究与应用的最新进展,关于计算机图形学的发展及应用探究
  3. 江西瑞金计算机网络设计工资多少,瑞金java工资一般多少
  4. c语言制作贪吃小白入门,小白入门——easyx界面版“贪吃蛇”的C语言实现(详细)...
  5. Part One 基本数据类型
  6. Eclipse中自动创建set、get方法
  7. php 每日一句名人名言,每日一句人生格言
  8. Android 源码编译过程
  9. VB 将文件夹复制到指定目录
  10. 【转】VB动态拖曳ListBox Item位置