golang协程工作池处理多任务示例

1. 工作方法实现

// 工作线程
// id : 线程号
// jobs : 任务通道 (chan)
// results: 完成结果通道 (chan)
func worker(id int, jobs <-chan int, results chan<- int) {//遍历任务for j := range jobs {fmt.Println("工作协程: ", id, "启动任务: ", j)fmt.Println(">>>>>>休眠2秒,模拟工作处理数据中...")time.Sleep(time.Second)fmt.Println("工作协程: ", id, "结束任务", j)results <- j * 2 //任务完成后写入结果到通道}
}

2.创建任务通道与任务执行结果通道

const numJobs = 5                  //通道容量jobarr := make(chan int, numJobs)  //任务通道results := make(chan int, numJobs) //任务执行结果通道

3.创建协程工作池

//启动3个工作协程for w := 1; w <= 3; w++ {go worker(w, jobarr, results)}

4.向工作通道发送任务

//向任务通道发送5个任务for j := 1; j <= numJobs; j++ {jobarr <- j //发送任务到任务通道}close(jobarr) //关闭任务通道

5.遍历执行结果:

//遍历执行结果for a := 1; a <= numJobs; a++ {<-results //读取通道数据不做处理}

6.完整示例

// 工作线程
// id : 线程号
// jobs : 任务通道 (chan)
// results: 完成结果通道 (chan)
func worker(id int, jobs <-chan int, results chan<- int) {//遍历任务for j := range jobs {fmt.Println("工作协程: ", id, "启动任务: ", j)fmt.Println(">>>>>>休眠2秒,模拟工作处理数据中...")time.Sleep(time.Second)fmt.Println("工作协程: ", id, "结束任务", j)results <- j * 2 //任务完成后写入结果到通道}
}const numJobs = 5                  //通道容量jobarr := make(chan int, numJobs)  //任务通道results := make(chan int, numJobs) //任务执行结果通道//启动3个工程协程for w := 1; w <= 3; w++ {go worker(w, jobarr, results)}//向任务通道发送5个任务for j := 1; j <= numJobs; j++ {jobarr <- j //发送任务到任务通道}close(jobarr) //关闭任务通道//遍历执行结果for a := 1; a <= numJobs; a++ {<-results //读取通道数据不做处理}

输出结果:

工作协程:  3 启动任务:  1
>>>>>>休眠2秒,模拟工作处理数据中...
工作协程:  2 启动任务:  2
>>>>>>休眠2秒,模拟工作处理数据中...
工作协程:  1 启动任务:  3
>>>>>>休眠2秒,模拟工作处理数据中...
工作协程:  2 结束任务 2
工作协程:  2 启动任务:  4
>>>>>>休眠2秒,模拟工作处理数据中...
工作协程:  3 结束任务 1
工作协程:  3 启动任务:  5
>>>>>>休眠2秒,模拟工作处理数据中...
工作协程:  1 结束任务 3
工作协程:  3 结束任务 5
工作协程:  2 结束任务 4

执行流程示例图:

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

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

相关文章

oracle中如何查询特定日期?

1. select last_day(to_date(20230101,YYYYMMDD)) from dual; select last_day(to_date(V_END_DATE,YYYYMMDD)) from dual; --查询任意一天 当月的最后一天 2. select to_char(to_date(20230101,YYYYMMDD)-1,YYYYMMDD) INTO V_START_DATE FROM DUAL; select to_char(to_dat…

vscode输出控制台中文显示乱码最有效解决办法

当VSCode的输出控制台中文显示乱码时&#xff0c;一个有效的解决办法是通过设置环境变量来确保编码的正确性。以下是解决方式&#xff1a; 首先&#xff0c;设置环境变量以修正乱码问题&#xff1a; 如果上述方法没有解决乱码问题&#xff0c;请继续以下步骤&#xff1a; 右键…

技术革命的十年:计算机、互联网、大数据、云计算与AI

近10年来&#xff0c;计算机、互联网、大数据、云计算和人工智能等技术领域发展迅速&#xff0c;带来了巨大的变革和创新。以下是各个领域的发展历史、现状、问题瓶颈、未来趋势以及可能的奇点。 计算机技术&#xff1a; 发展历史&#xff1a; 过去&#xff1a;过去十年间&am…

HTML5表单元素:重塑数据收集的艺术

HTML5为网页表单带来了革命性的变化&#xff0c;不仅增强了用户体验&#xff0c;也为开发者提供了更加强大和灵活的工具来收集和验证数据。本文将深入解析HTML5中新增和改进的表单元素&#xff0c;通过实例展示它们如何提升表单功能和交互性。 1. 新增表单元素 <input>…

SVN中trunk,branch,tag

SVN trunk(主线) branch(分支) tag(标记) 用法详解和详细操作步骤_svn 分支-CSDN博客 场景: 项目的1.0版本已经完成开发,测试,并上线了. 接到了新需求,要修改多个文件的代码. 你写了一段时间的时候,用户或测试人员反馈, 1.0版本有重大bug要修复,修复好后立刻上线. 此时应该怎么…

RocketMQ的安装

首先到RocketMQ官网下载页面下载 | RocketMQ (apache.org)&#xff0c;本机解压缩&#xff0c;作者在这里用的是最新的5.2.0版本。按照如下步骤安装。 1、环境变量配置rocket mq地址 ROCKETMQ_HOME D:\rocketmq-all-5.2.0-bin-release 在变量path中添加”%ROCKETMQ_HOME%\bi…

免费数据库同步软件

在信息化日益发展的今天&#xff0c;数据同步成为了企业和个人用户不可或缺的一部分。数据库同步软件作为数据同步的重要工具&#xff0c;能够帮助我们实现不同数据库系统之间的数据复制和同步&#xff0c;确保数据的一致性和完整性。本文将介绍几款免费数据库同步软件&#xf…

ES5/ES6 的继承除了写法以外还有什么区别?

一、主要区别 ES5 的继承实质上是先创建子类的实例对象&#xff0c; 然后再将父类的方法添加 到 this 上&#xff08;Parent.apply(this)&#xff09; . ES6 的继承机制完全不同&#xff0c; 实质上是先创建父类的实例对象 this&#xff08;所以必 须先调用父类的 super()方法…

C#根据反射生成sql语句(Update语句)

今天有人问我Update语句怎么搞&#xff0c;想了一下大致思路就是用特性去标识一下&#xff0c;主键&#xff0c;然后再去用反射的方式拼sql语句。 在C#中&#xff0c;我们可以使用特性&#xff08;Attributes&#xff09;来标识一个类的属性作为该类的主键&#xff08;Primary…

旅游卡系统开发搭建

旅游卡系统的开发搭建是一个涉及多个步骤和关键因素的复杂过程。以下是关于旅游卡系统开发搭建的详细步骤和要点&#xff1a; 一、需求分析 目标用户调研&#xff1a;深入调研目标用户&#xff0c;了解他们的需求和痛点&#xff0c;从而确定系统的功能和特点。功能确定&#…

数据分析必备:一步步教你如何用Pandas做数据分析(20)

1、Pandas 分类数据 Pandas 分类数据的操作实例 数据通常实时包含重复的文本列。性别&#xff0c;国家/地区和代码等功能始终是重复的。这些是分类数据的示例。 分类变量只能采用有限的且通常是固定数量的可能值。除固定长度外&#xff0c;分类数据可能还具有顺序&#xff0c;…

elasticsearch安装与使用(1)-使用docker安装Elasticsearch

ES的优点&#xff1a; 1、分布式准实时2、提供REST风格的API接口&#xff0c;是用户可解借助任何语言使用https对ES执行请求来完成搜索任务&#xff1b;3、提供聚合功能 1、Elasticsearch安装 docker network create elastic docker pull docker.elastic.co/elasticsearch/e…

MySQL入门学习-聚合和分组.计数(COUNT()函数)

在 MySQL 中&#xff0c;聚合和分组是用于对数据进行汇总和分析的强大功能。聚合函数可以计算数据的总和、平均值、最小值、最大值等统计信息&#xff0c;而分组则可以将数据按照特定的字段进行分组&#xff0c;然后对每个分组进行聚合计算。计数&#xff08;COUNT() 函数&…

【MYSQL系列】mysql中text,longtext,mediumtext区别

【MYSQL系列】mysql中text,longtext,mediumtext区别 在MySQL数据库中&#xff0c;TEXT、LONGTEXT和MEDIUMTEXT都是用于存储大量文本数据的字段类型。它们之间的主要区别在于可存储的数据大小和性能方面的差异。本文将探讨这些字段类型的特点、使用场景和一些最佳实践。 TEXT类…

贪心(不相交的开区间、区间选点、带前导的拼接最小数问题)

目录 1.简单贪心 2.区间贪心 不相交的开区间 1.如何删除&#xff1f; 2.如何比较大小 区间选点问题 3.拼接最小数 1.简单贪心 比如&#xff1a;给你一堆数&#xff0c;你来构成最大的几位数 2.区间贪心 不相交的开区间 思路&#xff1a; 首先&#xff0c;如果有两个…

代码随想录算法训练营第三十二天|LeetCode122 买卖股票的最佳时机Ⅱ、LeetCode55 跳跃游戏、LeetCode45 跳跃游戏Ⅱ

题1&#xff1a; 指路&#xff1a;122. 买卖股票的最佳时机 II - 力扣&#xff08;LeetCode&#xff09; 思路与代码&#xff1a; 基本思路&#xff1a;一天买入一天卖出&#xff0c;得到每部分正利润作为局部最优解&#xff0c;例如prices[7, 1, 5, 3, 6, 4]中&#xff0c;…

山东大学软件学院项目实训-创新实训-基于大模型的旅游平台(三十)- 微服务(10)

目录 12.5 RestClient操作索引库 12.5.1创建库 12.5.2 删除索引库 12.5.3 判断是否存在 12.6 RestClient操作文档 12.6.1 新增文档 12.6.2 查询文档 12.6.3 修改文档 12.6.4 删除文档 12.6.5 批量导入文档 12.5 RestClient操作索引库 酒店mapping映射 ​PUT /hotel{&…

shell简介

一、Shell 概念定义 Shell 是用 C 语言编写的程序&#xff0c;是用户使用 Linux 的桥梁&#xff0c;既是命令语言又是程序设计语言。 shell 脚本为 Shell 编写的脚本程序&#xff0c;常说的 shell 通常指 shell 脚本。 包含一系列命令的文本文件&#xff0c;这些命令按照特定…

调试环境搭建(Redis 6.X 版本)

今儿&#xff0c;我们来搭建一个 Redis 调试环境&#xff0c;目标是&#xff1a; 启动 Redis Server &#xff0c;成功断点调试 Server 的启动过程。使用 redis-cli 启动一个 Client 连接上 Server&#xff0c;并使用 get key 指令&#xff0c;发起一次 key 的读取。 视频可见…

【python解决】查询报%d format: a number is required, not str问题

【Python解决】查询报%d format: a number is required, not str问题 在Python中&#xff0c;字符串格式化是一种常见的操作&#xff0c;用于创建包含变量的字符串。如果你在使用%操作符进行格式化时遇到了%d format: a number is required, not str的错误&#xff0c;这意味着…