背景

golang中使用并发要考虑很多问题,如控制并发量等待Goroutine执行完毕等。
看下面一段代码:

var wg sync.WaitGroup
count := 10
wg.Add(count)
limitGoroutineCount := make(chan int,5)
for i:=0;i<count;i++{go func(a int){limitGoroutineCount <- 1if time.Now().Second()%4==0{wg.Done()<- limitGoroutineCountreturn}fmt.Println(a)wg.Done()<- limitGoroutineCount}(i)
}
wg.Wait()

其实真正的业务代码也就是:

for i:=0;i<count;i++{if time.Now().Second()%4==0{return}fmt.Println(a)
}

gpool简介

gpool能做到让开发人员专注业务,而不是满屏的并发相关的代码
gpool代码仓库:https://github.com/GuoFlight/gpool

导入gpool

import "github.com/GuoFlight/gpool"

example

//测试函数
func Test1(a int)int{return a
}
func main() {//得到进程池对象gp := gpool.NewDefault() //默认最大并发限制为10//将函数添加到线程池中for i:=0;i<1000;i++{err := gp.AddGoroutine(Test1,i)if err!=nil{fmt.Println(err)}}//执行线程池中的goroutine,默认会阻塞gp.Run()//得到结果,这里会乱序输出0到999for _,v1 := range gp.RetList{for _,v2 := range v1{fmt.Println(v2)}}
}

创建gpool对象

使用默认配置:

  • 默认情况下,最大并发限制为10
  • 默认情况下,执行Run方法会阻塞
gp := gpool.NewDefault()

自定义配置:

// 这里相当于gp := gpool.NewDefault()
// 参数1:最大并发数量
// 参数2:执行Run方法是否阻塞
gp := gpool.New(10,true)

那年,郭少在京城。

Golang线程池gpool相关推荐

  1. 关于线程池你不得不知道的一些设置

    2019独角兽企业重金招聘Python工程师标准>>> 微信公众号「后端进阶」,专注后端技术分享:Java.Golang.WEB框架.分布式中间件.服务治理等等. 老司机倾囊相授,带 ...

  2. 线程池 c linux 编程,关于c++:linux-c编程之高效线程池如何实现无琐化

    大多数线程池实现都离不开锁的应用,如互斥量pthread_mutex*联合条件变量pthread_cond*.家喻户晓,锁的应用对于程序性能影响较大,尽管现有的pthread_mutex*在锁的申请与 ...

  3. 十、Go协程的调度,互斥锁,计数器和线程池

    @Author:Runsen 在字节面试中,我见过:GO语言中的协程与Python中的协程的区别?其实就是要我讲解Go中GMP机制.我表示很多都用过,但是底层不了解. 那时我只知道与传统的系统级线程和 ...

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

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

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

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

  6. 中fifo算法_java线程池,工作窃取算法

    前言 在上一篇<java线程池,Executors阿里开发规范中为什么禁止使用Executors?>中我们谈及了线程池,同时又发现一个现象,当最大线程数还没有满的时候耗时的任务全部堆积给了 ...

  7. 500并发相当于多少人_linux开发技术之线程池accept处理高并发connect(含源码)

    前言 服务器在调用listen和accept后,就会阻塞在accept函数上,accpet函数返回后循环调用accept函数等待客户的TCP连接. 我们知道服务器段listen套接字能处理的连接数与监 ...

  8. 如何设计一个实用的线程池?

    原因排查 经过一个多小时的代码排查终于查明了线上程序线程数过多的原因:这是一个接收MQ消息的一个服务,程序大体思路是这样的,监听的线程每次收到一条消息,就启动一个线程去执行,每次启动的线程都是新的. ...

  9. 对警报线程池的警报线程_covid 19医院网络警报的警报可访问性剖析

    对警报线程池的警报线程 Older adults (65 years and up) and individuals of any age with serious underlying medica ...

最新文章

  1. 不畏浮云遮望眼--离散数学和组合数学
  2. 11大Java开源中文分词器的使用方法和分词效果对比
  3. SAP RETAIL 通过分配表创建UB STO单据
  4. python打不开-python程序无法打开是怎么回事
  5. MyEclipse 7.5优化
  6. docker 镜像的使用和下载
  7. python for in循环_Python傻瓜教程:跟我学for循环
  8. mysql日期时间操作函数详解
  9. Matlab2018a安装成功后,打开出现licensing error:-8523
  10. 图像处理-空间域锐化滤波
  11. Java基础---数组内容详解
  12. php6 配置,thinkphp6如何配置环境变量
  13. 《深入理解OSGi:Equinox原理、应用与最佳实践》一3.4 事件监听
  14. Delphi插件创建、调试与使用应用程序扩展
  15. 光猫修改rms服务器地址大全,光猫服务器dns怎么设置教程
  16. css格式规范stylelint在vscode使用教程(ctrl+s自动智能修复)
  17. 计算机共享wf,电脑怎么共享wifi网络
  18. php测试页面打开速度,在JS中如何测试目标网站的打开响应速度
  19. linux临时文件放哪,如何保障Linux的临时文件安全?
  20. js改变html font size,JavaScript fontsize方法入门实例(按照指定的尺寸来显示字符串)...

热门文章

  1. 高级变量类型 ------- 列表、元组、字典
  2. 经纬度换算数值_Excel中经纬度数据转换公式
  3. 深度学习——感知机:多层感知机(multi-layered perceptron)图文详解
  4. SpringBoot之RMI的简单使用
  5. python回测代码_python实现马丁策略回测3000只股票的实例代码
  6. 夏日炎炎玩转新加坡:盘点室内景点和夜游好去处
  7. 当个运营都难,二本生在如今的就业市场真的没出路了吗?
  8. 轻量化网络—ShuffleNet V1 V2理解
  9. 10000marker_为什么跑全基因组dna时为什么用10000bp的marker
  10. MFC程序的生死因果