当前位置: 首页 > news >正文

Golang Ants 构建协程池

构建的协程池实现两个目标:

1、限制协程池里开启的协程数量

2、当任务数大于协程数时,一个协程可以同时处理多个任务

3、监控是哪个协程ID处理了具体的任务

package mainimport ("fmt""runtime""strconv""strings""sync""github.com/panjf2000/ants/v2"
)var goRoutineID []int64 = make([]int64, 20)func printHelloWorld(i interface{}) {fmt.Println("hello,world:", i)//@todo 记录当前的协程IDgid := getGID()goRoutineID = append(goRoutineID, gid)}/*
*
获取协程ID
*
*/
func getGID() int64 {b := make([]byte, 64)b = b[:runtime.Stack(b, false)]//	fmt.Printf("%s", string(b))goidStr := strings.TrimPrefix(string(b), "goroutine ")goidStr = goidStr[:strings.Index(goidStr, " ")]gid, err := strconv.ParseInt(goidStr, 10, 64)if err != nil {return -1}return gid
}func main() {//关闭默认池defer ants.Release()//@定义任务总数,一个协程可以处理多个任务runTimes := 9var wg sync.WaitGroup//@定义协程池容量:100//@定义任务函数:printHelloWorld//@协程执行完成:wg.Done:让计数器减1操作p, _ := ants.NewPoolWithFunc(100, func(i interface{}) {printHelloWorld(i)wg.Done()})//@关闭协程池,释放工作队列defer p.Release()//@定义任务函数的传参,通过结构体的方式传参callParams := struct {name stringage  int}{name: "zhangsan",age:  44,}//@todo 提交任务//Invoke参数将参数传递给任务函数//wg.Add:计数器+1for i := 0; i < runTimes; i++ {wg.Add(1)_ = p.Invoke(callParams)}//@todo 阻塞等待所有的计数器清零wg.Wait()//p.Running 获取当前协程池执行工作的协程数量,注意这个不等于协程池配置的数量,比如当runTimes小于协程池配置的数量时,这时候只需要开runTimes个协程就够了,所以这里的值是runTimesfmt.Printf("running goroutines: %d\n", p.Running())//用map去重获取我们实际使用了哪些协程IDgoRoutineBool := make(map[int64]bool, 500)for _, v := range goRoutineID {goRoutineBool[v] = true}fmt.Println("实际开启的协程ID:", goRoutineBool)}

官方参考资料:

https://github.com/panjf2000/ants
https://pkg.go.dev/github.com/panjf2000/ants/v2@v2.9.0#section-readme

http://www.lryc.cn/news/312702.html

相关文章:

  • 【金三银四】面试题汇总(持续编写中)
  • Hive的数据存储
  • ORACLE 如何使用dblink实现跨库访问
  • Sentinel 面试题及答案整理,最新面试题
  • Qt在windows编译hiredis依赖库
  • 【工作向】protobuf编译生成pb.cc和pb.py文件
  • android 快速实现 垂直SeekBar(VerticalSeekBar)
  • 算法刷题day23:双指针
  • 学术论文GPT的源码解读与二次开发:从ChatPaper到gpt_academic
  • 报表生成器FastReport .Net用户指南:表达式(下)
  • JavaScript极速入门(1)
  • 鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:浮层)
  • Meta AI移动设备上部署LLM的新框架MobileLLM
  • 使用Tesseract-OCR对PDF等图片文件进行文字识别
  • 部署YOLOv8模型的实用常见场景
  • SpringBoot缓存
  • STC89C52串口通信详解
  • 基础算法|线性结构|前缀和学习
  • 设计模式之模版方法实践
  • sql中COALESCE函数详解
  • rust-analyzer报错“Failed to spawn one or more proc-macro servers,....“怎么解决?
  • Communications--9--一文读懂双机热备冗余原理
  • 可调恒定电流稳压器NSI50150ADT4G车规级LED驱动器 提供专业的汽车级照明解决方案
  • Unity中使用代码动态修改URP管线下的标准材质是否透明
  • 关于制作Python游戏全过程(汇总1)
  • 独立站营销新纪元:AI与大数据塑造个性化体验的未来
  • C语言项目实战——贪吃蛇
  • ArmSoM规划开发基于RK3576的开发套件
  • 视频剪辑如何提取伴奏?短视频剪辑有妙方
  • 【Web】浅浅地聊SnakeYaml反序列化两条常见利用链