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

Go 如何控制并发的goroutine数量?

为什么要控制goroutine并发的数量?

在开发过程中,如果不对goroutine加以控制而进行滥用的话,可能会导致服务整体崩溃。比如耗尽系统资源导致程序崩溃,或者CPU使用率过高导致系统忙不过来。

用什么方法控制goroutine并发的数量?

有缓冲channel

利用缓冲满时发送阻塞的特性

package mainimport ("fmt""runtime""time"
)var wg = sync.WaitGroup{}func main() {// 模拟用户请求数量requestCount := 10fmt.Println("goroutine_num", runtime.NumGoroutine())// 管道长度即最大并发数ch := make(chan bool, 3)for i := 0; i < requestCount; i++ {wg.Add(1)ch <- truego Read(ch, i)}wg.Wait()
}func Read(ch chan bool, i int) {fmt.Printf("goroutine_num: %d, go func: %d\n", runtime.NumGoroutine(), i)<-chwg.Done()
}

输出结果:默认最多不超过3(4-1)个goroutine并发执行

goroutine_num 1
goroutine_num: 4, go func: 1
goroutine_num: 4, go func: 3
goroutine_num: 4, go func: 2
goroutine_num: 4, go func: 0
goroutine_num: 4, go func: 4
goroutine_num: 4, go func: 5
goroutine_num: 4, go func: 6
goroutine_num: 4, go func: 8
goroutine_num: 4, go func: 9
goroutine_num: 4, go func: 7

无缓冲channel

任务发送和执行分离,指定消费者并发协程数

package mainimport ("fmt""runtime""sync"
)var wg = sync.WaitGroup{}func main() {// 模拟用户请求数量requestCount := 10fmt.Println("goroutine_num", runtime.NumGoroutine())ch := make(chan bool)for i := 0; i < 3; i++ {go Read(ch, i)}for i := 0; i < requestCount; i++ {wg.Add(1)ch <- true}wg.Wait()
}func Read(ch chan bool, i int) {for _ = range ch {fmt.Printf("goroutine_num: %d, go func: %d\n", runtime.NumGoroutine(), i)wg.Done()}
}

本文节选于Go合集《Go语言面试题精讲》
GOLANG ROADMAP 一个专注Go语言学习、求职的社区。

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

相关文章:

  • 【黑马程序员】1、TypeScript介绍_黑马程序员前端TypeScript教程,TypeScript零基础入门到实战全套教程
  • JS进阶——深入对象
  • Gitlab部署管理
  • MyBatis 学习(二)之 第一个 MyBatis 案例
  • 30天自制操作系统(第21天)
  • linux系统Jenkins的安装
  • 【GStreamer】basic-tutorial-1:GstBus、GstMessage详解
  • Python中的可变变量与不可变变量
  • OpenGL调用窗口,方向键和鼠标
  • fastAdmin表格列表的功能
  • 用来检查 CUDA、Conda 和 PyTorch 的版本的python文件
  • 基于Redisson,实现分布式锁注解
  • 【机器学习】机器学习是什么?
  • 一文速览深度伪造检测(Detection of Deepfakes):未来技术的守门人
  • C# 中的执行表达式树(Expression Tree)
  • 森林监测VR虚拟情景再现系统更便利
  • 高频面试题整理(一)
  • 2-23 switch、JVM内存模型、垃圾回收机制、this、static、变量的分类
  • 基础!!!吴恩达deeplearning.ai:卷积层
  • SpringBoot案例(黑马学习笔记)
  • 项目流程图
  • 鸿蒙这么大声势,为何迟迟看不见岗位?最新数据来了
  • Qt中关于信号与槽函数的思考
  • 项目技术栈-解决方案-消息队列
  • 【深度优先搜索】【图论】【推荐】332. 重新安排行程
  • DAY9-防病毒AV概述
  • TCP缓存
  • Socket网络编程(一)——网络通信入门基本概念
  • RTCA DO-178C 机载系统和设备认证中的软件注意事项-软件质量保证流程(八)
  • K 个一组翻转链表 力扣