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

go 协程并发数控制

错误的写法:
这里的<-ch 是为了从channel 中读取 数据,为了不使channel通道被写满,阻塞 go 协程数的创建。但是请注意,go workForDraw(v, &wg) 是不阻塞后续的<-ch 执行的,所以就一直go workForDraw(v, &wg) 拉起新的协程。这么是达不到控制协程并发数10 的目的
在这里插入图片描述

正确的写法:
直接将<-ch 写入workForDraw 方法里面的最后,这样只有 该 go 协程的任务 workForDraw 完成之后才会执行 <-ch ,使channel管道中的缓冲释放一个。
这样就把 <-ch 和 go 协程持有的任务 workForDraw 强制绑定,只有完成任务才会 <-ch ,如果不完成,只要channel通道的缓冲不满10 就可以继续创建新的go 协程持有workForDraw。直到缓冲满到10 为止

func ListenRedisQue() {ch := make(chan int, 10)var wg sync.WaitGroupfor {keyData, err := config.GetRedisClient().Keys(global.RedisQueueKey + "*").Result()fmt.Println("ListenRedisQue start for", keyData)if err != nil {fmt.Println("redis queue empty!!")return}for _, v := range keyData {ch <- 1wg.Add(1)go workForDraw(v, &wg, ch)}wg.Wait()}
}func workForDraw(queueKey string, wg *sync.WaitGroup, ch chan int) {defer wg.Done()<-ch 
}

在这里插入图片描述
另外切记 在for 循环中,一定不能初始化 db,或者其他消耗资源,可循环使用的动作,要将初始化提到for之外,将资源以变量或者指针形式传入 for 逻辑内部使用

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

相关文章:

  • MySQL的安装以及卸载
  • LRU算法与Caffeine、Redis中的缓存淘汰策略
  • HTML笔记(3)
  • c++——重写(覆盖),实际上对应的就是虚函数
  • 算法通关村——字符串反转问题解析
  • vue + elementui 中 在弹框中使用了 tree型结构(<el-tree></el-tree>),点击关闭按钮按钮重置tree
  • windows adb根据id点击按钮
  • netty(一):NIO——处理消息边界
  • 等保测评--安全计算环境--测评方法
  • open cv学习 (二)色彩空间和通道
  • RS232、RS422、RS485硬件及RS指令、RS2指令应用知识学习
  • 背景属性样式
  • 蓝桥杯每日N题 (消灭老鼠)
  • k8s 用户角色 权限的划分
  • 聊一下操作系统 macOS 与 Linux
  • OJ练习第153题——分发糖果
  • iOS 通知推送服务端部署测试过程详细版
  • 【COMP282 LEC3 LEC4 LEC5】
  • panda3d加载模型复习和python面向对象编程属性学习
  • 使用 Node.js 生成优化的图像格式
  • 【WinAPI详解】<CreateWindowEx详解>
  • 【Git】分支管理
  • 玩转单元测试之gtest
  • Tomcat 一次请求的生命周期
  • spring cloud gateway中配置uri
  • 使用NAudio录制wav音频
  • 数据结构之动态内存管理机制
  • 【汇编语言】栈及栈操作的实现
  • 【JavaEE】面向切面编程AOP是什么-Spring AOP框架的基本使用
  • SpringBoot+微信小程序奶茶在线点单小程序系统 附带详细运行指导视频