当前位置: 首页 > 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语言学习、求职的社区。

相关文章:

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

为什么要控制goroutine并发的数量&#xff1f; 在开发过程中&#xff0c;如果不对goroutine加以控制而进行滥用的话&#xff0c;可能会导致服务整体崩溃。比如耗尽系统资源导致程序崩溃&#xff0c;或者CPU使用率过高导致系统忙不过来。 用什么方法控制goroutine并发的数量&a…...

【黑马程序员】1、TypeScript介绍_黑马程序员前端TypeScript教程,TypeScript零基础入门到实战全套教程

课程地址&#xff1a;【黑马程序员前端TypeScript教程&#xff0c;TypeScript零基础入门到实战全套教程】 https://www.bilibili.com/video/BV14Z4y1u7pi/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 目录 1、TypeScript介绍 1.1 TypeScript是什…...

JS进阶——深入对象

构造函数 封装是面向对象思想中比较重要的一部分&#xff0c;js面向对象可以通过构造函数实现的封装。 前面我们学过的构造函数方法很好用&#xff0c;但是 存在浪费内存的问题 原型 目标&#xff1a;能够利用原型对象实现方法共享 构造函数通过原型分配的函数是所有对象所…...

Gitlab部署管理

一、安装 1.docker安装gitlab sudo docker run -d \-p 6080:80 -p 6022:22 \--name gitlab \--restart always \-v /srv/gitlab/config:/etc/gitlab \-v /srv/gitlab/logs:/var/log/gitlab \-v /srv/gitlab/data:/var/opt/gitlab \gitlab/gitlab-ce:latest2.存储说明 存储应…...

MyBatis 学习(二)之 第一个 MyBatis 案例

目录 1 配置 MyBatis 方式 1.1 XML 配置文件 1.2 Java 注解配置 1.3. Java API 配置 2 在 MySQL 中创建一张表 3 创建一个基于 Maven 的 JavaWeb 工程 4 编写 User 实体类 5 创建 Mybatis 全局配置文件 6 编写一个 DAO 或 Mapper 接口 7 编写 SQL 映射配置文件&#…...

30天自制操作系统(第21天)

21.1 攻克难题——字符串显示API 显示单个字符时&#xff0c;用 [CS:ECX] 的方式特意指定了 CS&#xff08;代码段寄存器&#xff09;&#xff0c;因此可以成功读取 msg的内容。但在显示字符串时&#xff0c;由于无法指定段地址&#xff0c;程序误以为是 DS而从完全错误的内存地…...

linux系统Jenkins的安装

Jenkins安装 安装上传安装包解压包首次登录要去服务器查看密码&#xff0c;更改密码选择需要安装的插件设置Admin用户和密码安装完成 安装 上传安装包 上传 jdk17 tomcat jenkins.war的安装包 . 上传 tomcat安装包解压包 解压jdk tar xf jdk-11.0.18_linux-x64_bin.tar.gz解…...

【GStreamer】basic-tutorial-1:GstBus、GstMessage详解

【目录】郭老二博文之:图像视频汇总 1、先看示例 #include <gst/gst.h>int main (int argc, char *argv[]) {GstElement *pipeline;GstBus...

Python中的可变变量与不可变变量

python中的可变与不可变变量 一、变量的三个参数 就像区分一个人一样&#xff0c;同样都是张三&#xff0c;可能这个张三就不是那个张三。同一个变量是指的什么相同呢&#xff1f; Python中的对象包含三个要素&#xff0c;id&#xff08;内存地址&#xff09;&#xff0c;typ…...

OpenGL调用窗口,方向键和鼠标

9.2 OpenGL调用窗口&#xff0c;方向键和鼠标 9.2.1 opengl调用窗口 OpenGL调用窗口步骤&#xff1a; 第一步&#xff1a;初始化 GLFW&#xff0c;初始化OpenGL,初始化窗口&#xff0c;初始化上下文 第二步&#xff1a;设置窗口大小和位置&#xff0c;设置输入输出 第三步…...

fastAdmin表格列表的功能

更多文章&#xff0c;请关注&#xff1a;fastAdmin后台功能详解 | 夜空中最亮的星 FastAdmin是一款基于ThinkPHP5Bootstrap的极速后台开发框架。优点见开发文档 介绍 - FastAdmin框架文档 - FastAdmin开发文档 在这里上传几张优秀的快速入门图: 一张图解析FastAdmin中的表格列…...

用来检查 CUDA、Conda 和 PyTorch 的版本的python文件

提供的 Python 代码片段包括几个语句&#xff0c;用来检查 CUDA、Conda 和 PyTorch 的版本&#xff0c;以及一些与 CUDA 相关的系统配置。让我们分解一下&#xff1a;PyTorch 版本和配置&#xff1a;torch.__config__.show()&#xff1a;显示 PyTorch 的构建配置。 torch.__ver…...

基于Redisson,实现分布式锁注解

1.原始写法 我们平常使用redisson的分布式锁是不是基本都用下面的这个模板&#xff0c;既然是模板&#xff0c;那为何不把他抽出来呢&#xff1f; // 尝试加锁&#xff0c;最多等待100秒&#xff0c;上锁以后10秒自动解锁 boolean res lock.tryLock(100, 10, TimeUnit.SECON…...

【机器学习】机器学习是什么?

你知道机器学习是什么吗&#xff1f;它就像是一个超级聪明的孩子&#xff0c;可以通过观察和经验不断学习和成长。而我们要做的就是培养和教育这个孩子&#xff0c;让他能够从数据中学习并做出决策和预测。 那么&#xff0c;我们该如何培养和教育这个聪明的孩子呢&#xff1f;首…...

一文速览深度伪造检测(Detection of Deepfakes):未来技术的守门人

一文速览深度伪造检测&#xff08;Detection of Deepfakes&#xff09;&#xff1a;未来技术的守门人 前言一、Deepfakes技术原理卷积神经网络&#xff08;CNN&#xff09;&#xff1a;细致的艺术学徒生成对抗网络&#xff08;GAN&#xff09;&#xff1a;画家与评审的双重角色…...

C# 中的执行表达式树(Expression Tree)

引言&#xff1a; 在C#编程中&#xff0c;表达式树&#xff08;Expression Tree&#xff09;是一种强大的工具&#xff0c;用于表示和执行计算表达式。表达式树将计算表达式抽象为树状结构&#xff0c;每个节点代表表达式中的一个元素&#xff0c;如常量、变量、方法调用等。本…...

森林监测VR虚拟情景再现系统更便利

AI人工智能技术已经逐渐渗透到各个领域&#xff0c;为我们的生活带来了诸多便利。在虚拟仿真教学领域&#xff0c;AI技术的应用也日益丰富&#xff0c;为虚拟情景交互体验带来了前所未有的好处。 提高VR虚拟情景的逼真度 通过深度学习和计算机视觉等技术&#xff0c;AI/VR虚拟现…...

高频面试题整理(一)

文章目录 平台无关性如何实现&#xff1f;JVM如何加载 .class文件&#xff1f;什么是反射?谈谈ClassLoader谈谈类的双亲委派机制类的加载方式Java的内存模型?JVM内存模型-jdk8程序计数器&#xff1a;Java虚拟机栈局部变量表和操作数栈&#xff1a; Java内存模型中堆和栈的区别…...

2-23 switch、JVM内存模型、垃圾回收机制、this、static、变量的分类

文章目录 switch 实现成绩评级JVM内存模型概念栈的特点堆的特点 垃圾回收机制通用的分代垃圾回收机制三种清理算法垃圾回收过程垃圾回收常见的两种检测引用算法内存泄露常见原因 this的用法创建对象的四步 static 静态特点 变量的分类和作用域import switch 实现成绩评级 switc…...

基础!!!吴恩达deeplearning.ai:卷积层

以下内容有任何不理解可以翻看我之前的博客哦&#xff1a;吴恩达deeplearning.ai专栏 文章目录 回顾——密集层 Dense Layer卷积层 Convolutional Neural Network定义优势具体说明心电图卷积层搭建 到目前为止&#xff0c;你使用的所有神经网络层都是密集层类型&#xff0c;这…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...