go 利用channel控制并发

任务数量为50,并发在5,全部都要执行 

package mainimport ("fmt""time"
)type Con struct {num  inttime string
}func main() {//channel实现并发控制// 定义同时执行的任务数量concurrencyLevel := 5//总任务数totalTask := 50// 创建一个有缓冲的 channel 用于控制并发数taskChan := make(chan int, concurrencyLevel)// 创建一个 channel 用于标记所有任务完成doneChan := make(chan *Con, totalTask)// 启动指定数量的 goroutine 来并发执行任务for i := 0; i < concurrencyLevel; i++ {go concurrentTask(taskChan, doneChan)}// 发送任务到 taskChan//循环发送任务,保证每个任务都能发送到,如果发送任务时 taskChan 阻塞,等待一段时间再重试for i := 1; i <= totalTask; i++ {select {// 发送任务到 taskChancase taskChan <- i://fmt.Printf("任务 %d 已发送\n", i)default:fmt.Println("任务发送阻塞,等待空闲...", i)// 等待 1 秒钟再重试time.Sleep(1 * time.Second)i--}}// 关闭 taskChan,通知所有的 goroutine 没有更多的任务close(taskChan)// 关闭 doneChanclose(doneChan)等待所有任务完成,并关闭 doneChanfor res := range doneChan {fmt.Printf("任务 %d 完成, 完成时间:%s\n", res.num, res.time)}fmt.Println("所有任务已完成")}// 模拟一个并发执行的任务
func concurrentTask(taskChan chan int, doneChan chan *Con) {defer func() {// 捕获 panic,recover() 函数可以让程序从 panic 中恢复if r := recover(); r != nil {fmt.Println("任务发生panic,正在恢复:", r)}}()// 从 taskChan 中获取任务for task := range taskChan {fmt.Printf("处理任务 %d\n", task)time.Sleep(1 * time.Second) // 模拟任务执行时间//任务执行完毕,将任务结果发送到 doneChandoneChan <- &Con{num: task, time: time.Now().Format("2006-01-02 15:04:05")}}}

任务数量为50,并发在5,遇到阻塞的就不再执行

package mainimport ("fmt""time"
)type Con struct {num  inttime string
}func main() {//channel实现并发控制// 定义同时执行的任务数量concurrencyLevel := 5//总任务数totalTask := 50// 创建一个有缓冲的 channel 用于控制并发数taskChan := make(chan int, concurrencyLevel)// 创建一个 channel 用于标记所有任务完成doneChan := make(chan *Con, totalTask)// 启动指定数量的 goroutine 来并发执行任务for i := 0; i < concurrencyLevel; i++ {go concurrentTask(taskChan, doneChan)}// 发送任务到 taskChan//循环发送任务,保证每个任务都能发送到,如果发送任务时 taskChan 阻塞,等待一段时间再重试for i := 1; i <= totalTask; i++ {select {// 发送任务到 taskChancase taskChan <- i://fmt.Printf("任务 %d 已发送\n", i)default:fmt.Println("任务发送阻塞,等待空闲...", i)}}// 关闭 taskChan,通知所有的 goroutine 没有更多的任务close(taskChan)// 关闭 doneChanclose(doneChan)等待所有任务完成,并关闭 doneChanfor res := range doneChan {fmt.Printf("任务 %d 完成, 完成时间:%s\n", res.num, res.time)}fmt.Println("所有任务已完成")}// 模拟一个并发执行的任务
func concurrentTask(taskChan chan int, doneChan chan *Con) {defer func() {// 捕获 panic,recover() 函数可以让程序从 panic 中恢复if r := recover(); r != nil {fmt.Println("任务发生panic,正在恢复:", r)}}()// 从 taskChan 中获取任务for task := range taskChan {fmt.Printf("处理任务 %d\n", task)time.Sleep(1 * time.Second) // 模拟任务执行时间//任务执行完毕,将任务结果发送到 doneChandoneChan <- &Con{num: task, time: time.Now().Format("2006-01-02 15:04:05")}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/815418.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【网络编程】高性能并发服务器源码剖析

hello &#xff01;大家好呀&#xff01; 欢迎大家来到我的网络编程系列之洪水网络攻击&#xff0c;在这篇文章中&#xff0c;你将会学习到在网络编程中如何搭建一个高性能的并发服务器&#xff0c;并且我会给出源码进行剖析&#xff0c;以及手绘UML图来帮助大家来理解&#xf…

教你将配置好的conda环境迁移到其它设备

文章目录 问题分析存在的方法环境要求方法步骤1. 下载conda pack2. 打包原环境3. 新设备还原环境4. 查看环境 问题分析 好不容易配置好的conda环境&#xff0c;要在另一个设备上运行&#xff0c;还要重新配置&#xff0c;好麻烦。 存在的方法 pip install -r requirement.txt …

Node.js留言板(超详细注释)

目录结构如下 app.js // 一.引入模块 var http require(http);// 用于创建 HTTP 服务器和处理 HTTP 请求 var fs require(fs);// 用于读取和写入文件 var url require(url);// 用于解析URL// 创建留言数据对象 var msgs [{ name: 牛二, content: "我是妞儿", cr…

Flink学习(五)-流式分析

一、时间分类 事件时间(event time)&#xff1a; 事件产生的时间&#xff0c;记录的是设备生产(或者存储)事件的时间 摄取时间(ingestion time)&#xff1a; Flink 读取事件时记录的时间 处理时间(processing time)&#xff1a; Flink pipeline 中具体算子处理事件的时间 二、…

场景:数据库死锁

来自hollis八股文 流程图 前置知识 数据库上锁锁住的不是行&#xff0c;而是索引的主键 比如我对id 1的主键进行上锁&#xff0c;实际上是对查询使用的主键的key 1 进行上锁 对非聚簇索引操作时&#xff0c;首先会对非聚簇索引上锁&#xff0c;然后在请求主键的锁 比如我…

为什么开关电源变压器的耦合不可能为100%?什么是漏感?

一、为什么开关电源变压器的耦合不可能为100%&#xff1f; 变压器耦合度是指变压器初级绕组和次级绕组之间能量传递的效率&#xff0c;它反映了变压器在电磁感应过程中&#xff0c;初级侧磁通量能够有多少比例被次级侧有效利用。理论上&#xff0c;理想的变压器耦合度应该是10…

08 Php学习:if语句、Switch语句

PHP 条件语句 当您编写代码时&#xff0c;您常常需要为不同的判断执行不同的动作。您可以在代码中使用条件语句来完成此任务。 在 PHP 中&#xff0c;提供了下列条件语句&#xff1a; if 语句 - 在条件成立时执行代码 if…else 语句 - 在条件成立时执行一块代码&#xff0c;…

Java实现短信发送并校验,华为云短信配合Redis实现发送与校验

Java实现短信发送并校验&#xff0c;华为云短信配合Redis实现发送与校验 安装sms4j和redis <dependency><groupId>org.dromara.sms4j</groupId><artifactId>sms4j-spring-boot-starter</artifactId><version>3.2.1</version> <…

WPS基础使用

个人笔记&#xff08;整理不易&#xff0c;有帮助&#xff0c;收藏点赞评论&#xff0c;爱你们&#xff01;&#xff01;&#xff01;你的支持是我写作的动力&#xff09; 笔记目录&#xff1a;学习笔记目录_pytest和unittest、airtest_weixin_42717928的博客-CSDN博客 个人随笔…

单路高清HDMI编码器JR-3211HD

产品简介&#xff1a; JR-3211HD单路高清HDMI编码器是专业的高清音视频编码产品&#xff0c;该产品具有支持1路高清HDMI音视频采集功能&#xff0c; 1路3.5MM独立外接音频输入&#xff0c;编码输出双码流H.264格式&#xff0c;音频MP3/AAC格式。编码码率可调&#xff0c;画面质…

SHARE 203S PRO:倾斜摄影相机在地灾救援中的应用

在地质灾害的紧急关头&#xff0c;救援队伍面临的首要任务是迅速而准确地掌握灾区的地理信息。这时&#xff0c;倾斜摄影相机成为了救援测绘的利器。SHARE 203S PRO&#xff0c;这款由深圳赛尔智控科技有限公司研发的五镜头倾斜摄影相机&#xff0c;以其卓越的性能和功能&#…

每日一题:C语言经典例题之最受欢迎歌手

题目描述 学校推出了10名歌手&#xff0c;每个歌手都有唯一编号。校学生会想知道这些歌手受欢迎的程度&#xff0c;设了一个投票箱&#xff0c;让每一个同学给自己喜欢的歌手投票&#xff0c;同学们使用歌手编号进行投票。现在学生会找你帮忙统计一下每位歌手获得的票数&#x…

QtCreater 使用

QtCreater 创建项目 1.刚进入 QtCreater 的界面是这样的一个界面 ① 创建一个新的文件&#xff0c;那么我们就选择左上角的 “文件” ② 点击新建文件&#xff0c;或者也可以直接使用快捷键 CtrlN 此时就会弹出对话框&#xff0c;让我们选择想要创建的文件&#xff1a; Appli…

python爬虫-----爬虫解析—xpath(第十八天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

一体化泵站的生产制造流程怎样

诸城市鑫淼环保小编带大家了解一下一体化泵站的生产制造流程怎样 综合泵站和传统式混泥土泵站的一大差别是&#xff0c;离去制造厂前&#xff0c;能够开展全部机械设备设备的生产加工及零部件加工&#xff0c;随后运送到建筑项目当场开展安裝。这类经营方式缩短了开发周期&…

Nginx日志格式化和追踪

背景 Nginx是一款功能强大的Web服务器&#xff0c;对于网络环境中的日志记录和配置至关重要。定制化Nginx日志格式可以帮助管理员更好地监控服务器性能、分析用户行为并做出相应优化。在本文中&#xff0c;我们将深入探讨Nginx日志格式的高级定制化策略&#xff0c;包括理解基…

每日练习——leetcode77和347

目录 347. 前 K 个高频元素 题目描述 解题思路 代码实现 77. 组合 题目描述 解题思路 代码实现 347. 前 K 个高频元素 题目描述 给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 示例 1: 输入: nu…

API接口京东开放平台item_get-获得京东商品详情API接口根据商品ID查询商品标题价格描述等详情数据

京东商品详情API接口可以提供以下方面的信息&#xff1a; 商品基础信息&#xff1a;包括商品的标题、价格、描述、图片等基本信息&#xff0c;这是构建电商平台的基础数据。商品分类信息&#xff1a;帮助用户更好地了解商品所属的类别&#xff0c;便于商品筛选和查找。商品销售…

sheng的学习笔记-AI-决策树(Decision Tree)

AI目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 目录 什么是决策树 划分选择 信息增益 增益率 基尼指数 剪枝处理 预剪枝 后剪枝 连续值处理 另一个例子 基本步骤 排序 计算候选划分点集合 评估分割点 每个分割点都进行评估&#xff0c;找到最大信息增益的…

DB schema表中使用全局变量及在DB组件中查询

DB schema表中使用全局变量及在DB组件中查询 规则如下&#xff1a; 使用如下&#xff1a; 如果在unicloud-db组件上不加判断条件&#xff0c;就会报错&#xff0c;并进入到登录页。 那么就会进入到登录页&#xff0c;加上了判断条件&#xff0c;有数据了就不会了。 因为在sc…