Golang线程池gpool
背景
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 <- 1
if time.Now().Second()%4==0{
wg.Done()
<- limitGoroutineCount
return
}
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到999
for _,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的更多相关文章
- Golang 线程池
经常会用到协程,但是不能一下开那么多协调,只需要 poolSize 个即可,多了不行.这些个协程在执行完后必须等其完成之后才能进行下一步动作.假定工作方法为 work . package main i ...
- .net线程池内幕
本文通过对.NET4.5的ThreadPool源码的分析讲解揭示.NET线程池的内幕,并总结ThreadPool设计的好与不足. 线程池的作用线程池,顾名思义,线程对象池.Task和TPL都有用到线程 ...
- .net线程池
线程池的作用线程池,顾名思义,线程对象池.Task和TPL都有用到线程池,所以了解线程池的内幕有助于你写出更好的程序.由于篇幅有限,在这里我只讲解以下核心概念: 线程池的大小 如何调用线程池添加任务 ...
- java线程池,工作窃取算法
前言 在上一篇<java线程池,阿里为什么不允许使用Executors?>中我们谈及了线程池,同时又发现一个现象,当最大线程数还没有满的时候耗时的任务全部堆积给了单个线程, 代码如下: T ...
- 线程池+同步io和异步io(浅谈)
线程池+同步io和异步io(浅谈) 来自于知乎大佬的一个评论 我们的系统代码从同步方式+线程池改成异步化之后压测发现性能提高了一倍,不再有大量的空闲线程,但是CPU的消耗太大,几乎打满,后来改成协程化 ...
- 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)
前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...
- C#多线程之线程池篇3
在上一篇C#多线程之线程池篇2中,我们主要学习了线程池和并行度以及如何实现取消选项的相关知识.在这一篇中,我们主要学习如何使用等待句柄和超时.使用计时器和使用BackgroundWorker组件的相关 ...
- C#多线程之线程池篇2
在上一篇C#多线程之线程池篇1中,我们主要学习了如何在线程池中调用委托以及如何在线程池中执行异步操作,在这篇中,我们将学习线程池和并行度.实现取消选项的相关知识. 三.线程池和并行度 在这一小节中,我 ...
- C#多线程之线程池篇1
在C#多线程之线程池篇中,我们将学习多线程访问共享资源的一些通用的技术,我们将学习到以下知识点: 在线程池中调用委托 在线程池中执行异步操作 线程池和并行度 实现取消选项 使用等待句柄和超时 使用计时 ...
- NGINX引入线程池 性能提升9倍
1. 引言 正如我们所知,NGINX采用了异步.事件驱动的方法来处理连接.这种处理方式无需(像使用传统架构的服务器一样)为每个请求创建额外的专用进程或者线程,而是在一个工作进程中处理多个连接和请求.为 ...
随机推荐
- PostMan接口测试实用小点
PostMan接口测试实用小点 1. 接口测试变量存取操作 在Postman中有很多地方可以存储一些变量,这里只介绍经常使用的环境变量.变量设置后,在UI界面可以通过{{变量名}}获取到对应值. 在环 ...
- Mybatis的逆向工程(generator)
Tips:Mybatis generator官网 http://www.mybatis.org/generator/configreference/commentGenerator.html Myba ...
- ES_CCS/R(三):跨集群复制 Cross-cluster replication(CCR)
跨集群复制(CCR)功能支持将远程集群中的索引复制到本地集群. 可以在一些常见的生产用例中使用此功能: 灾难恢复(DR)/高可用性(HA):如果主群集发生故障,则进行灾难恢复. 辅助群集可以用作热备份 ...
- 我用 GitHub 9.8k 的 Go 语言 2D 游戏引擎写了个游戏
前言 hi,大家好,这里是白泽.今天给大家分享一个 GitHub 9.8k 的 Go 语言 2D 游戏引擎. https://github.com/hajimehoshi/ebiten 引擎的贡献者依 ...
- Linux-0.11操作系统源码调试
学习操作系统有比较好的两种方式,第一种是跟着别人写一个操作系统出来,<操作系统真相还原>.<Orange's:一个操作系统的实现>等书就是教学这个的:另一种方式就是调试操作系统 ...
- uni-app上使用leaflet地图的解决方案
在uni-app上自带有map组件,但是那个组件功能太弱,很多高级用法很难实现.用npm添加leaflet呢,又各种报错. 偶然和朋友聊起,可以用html来实现leaflet地图,然后用webview ...
- ECMAScript 语言规范每年都会进行一次更新,而备受期待的 ECMAScript 2024 将于 2024 年 6 月正式亮相。目前,ECMAScript 2024 的候选版本已经发布,为我们带来了一系列实用的新功能。
Promise.withResolvers 使用 Promise.withResolvers() 关键的区别在于解决和拒绝函数现在与 Promise 本身处于同一作用域,而不是在执行器中被创建和一次性 ...
- SpringCloud解决feign调用token丢失问题
背景讨论 feign请求 在微服务环境中,完成一个http请求,经常需要调用其他好几个服务才可以完成其功能,这种情况非常普遍,无法避免.那么就需要服务之间的通过feignClient发起请求,获取需要 ...
- 深入探讨Function Calling:在Semantic Kernel中的应用实践
引言 上一章我们熟悉了 OpenAI 的 function calling 的执行原理,这一章节我们讲解一下 function calling 在 Semantic Kernel 的应用. 在Open ...
- SCOI 回旋退役记
02.21 day -2 开始写了,期望这不是真的退役记吧.但是不是的概率好小-- 这几天一直考试,怎么说呢,到差不差的,也就那个样子. 归根结底,菜是原罪,和那些大佬相比我真的很很很菜啊.当时看 c ...