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

2024-06-07 16:28

本文主要是介绍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

执行流程示例图:

这篇关于golang协程工作池处理多任务示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1039688

相关文章

Java springBoot初步使用websocket的代码示例

《JavaspringBoot初步使用websocket的代码示例》:本文主要介绍JavaspringBoot初步使用websocket的相关资料,WebSocket是一种实现实时双向通信的协... 目录一、什么是websocket二、依赖坐标地址1.springBoot父级依赖2.springBoot依赖

kotlin中的模块化结构组件及工作原理

《kotlin中的模块化结构组件及工作原理》本文介绍了Kotlin中模块化结构组件,包括ViewModel、LiveData、Room和Navigation的工作原理和基础使用,本文通过实例代码给大家... 目录ViewModel 工作原理LiveData 工作原理Room 工作原理Navigation 工

讯飞webapi语音识别接口调用示例代码(python)

《讯飞webapi语音识别接口调用示例代码(python)》:本文主要介绍如何使用Python3调用讯飞WebAPI语音识别接口,重点解决了在处理语音识别结果时判断是否为最后一帧的问题,通过运行代... 目录前言一、环境二、引入库三、代码实例四、运行结果五、总结前言基于python3 讯飞webAPI语音

Golang中拼接字符串的6种方式性能对比

《Golang中拼接字符串的6种方式性能对比》golang的string类型是不可修改的,对于拼接字符串来说,本质上还是创建一个新的对象将数据放进去,主要有6种拼接方式,下面小编就来为大家详细讲讲吧... 目录拼接方式介绍性能对比测试代码测试结果源码分析golang的string类型是不可修改的,对于拼接字

MySQL中COALESCE函数示例详解

《MySQL中COALESCE函数示例详解》COALESCE是一个功能强大且常用的SQL函数,主要用来处理NULL值和实现灵活的值选择策略,能够使查询逻辑更清晰、简洁,:本文主要介绍MySQL中C... 目录语法示例1. 替换 NULL 值2. 用于字段默认值3. 多列优先级4. 结合聚合函数注意事项总结C

什么是 Java 的 CyclicBarrier(代码示例)

《什么是Java的CyclicBarrier(代码示例)》CyclicBarrier是多线程协同的利器,适合需要多次同步的场景,本文通过代码示例讲解什么是Java的CyclicBarrier,感... 你的回答(口语化,面试场景)面试官:什么是 Java 的 CyclicBarrier?你:好的,我来举个例

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

HTML5 data-*自定义数据属性的示例代码

《HTML5data-*自定义数据属性的示例代码》HTML5的自定义数据属性(data-*)提供了一种标准化的方法在HTML元素上存储额外信息,可以通过JavaScript访问、修改和在CSS中使用... 目录引言基本概念使用自定义数据属性1. 在 html 中定义2. 通过 JavaScript 访问3.

Python使用PIL库将PNG图片转换为ICO图标的示例代码

《Python使用PIL库将PNG图片转换为ICO图标的示例代码》在软件开发和网站设计中,ICO图标是一种常用的图像格式,特别适用于应用程序图标、网页收藏夹图标等场景,本文将介绍如何使用Python的... 目录引言准备工作代码解析实践操作结果展示结语引言在软件开发和网站设计中,ICO图标是一种常用的图像

C++ Primer 标准库vector示例详解

《C++Primer标准库vector示例详解》该文章主要介绍了C++标准库中的vector类型,包括其定义、初始化、成员函数以及常见操作,文章详细解释了如何使用vector来存储和操作对象集合,... 目录3.3标准库Vector定义和初始化vector对象通列表初始化vector对象创建指定数量的元素值