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

GO语言网络编程(并发编程)Goroutine池

GO语言网络编程(并发编程)Goroutine池

1. Goroutine池

1.1.1. worker pool(goroutine池)

  • 本质上是生产者消费者模型
  • 可以有效控制goroutine数量,防止暴涨
  • 需求:
    • 计算一个数字的各个位数之和,例如数字123,结果为1+2+3=6
    • 随机生成数字进行计算
  • 控制台输出结果如下:
    在这里插入图片描述
package mainimport ("fmt""math/rand"
)type Job struct {// idId int// 需要计算的随机数RandNum int
}type Result struct {// 这里必须传对象实例job *Job// 求和sum int
}func main() {// 需要2个管道// 1.job管道jobChan := make(chan *Job, 128)// 2.结果管道resultChan := make(chan *Result, 128)// 3.创建工作池createPool(64, jobChan, resultChan)// 4.开个打印的协程go func(resultChan chan *Result) {// 遍历结果管道打印for result := range resultChan {fmt.Printf("job id:%v randnum:%v result:%d\n", result.job.Id,result.job.RandNum, result.sum)}}(resultChan)var id int// 循环创建job,输入到管道for {id++// 生成随机数r_num := rand.Int()job := &Job{Id:      id,RandNum: r_num,}jobChan <- job}
}// 创建工作池
// 参数1:开几个协程
func createPool(num int, jobChan chan *Job, resultChan chan *Result) {// 根据开协程个数,去跑运行for i := 0; i < num; i++ {go func(jobChan chan *Job, resultChan chan *Result) {// 执行运算// 遍历job管道所有数据,进行相加for job := range jobChan {// 随机数接过来r_num := job.RandNum// 随机数每一位相加// 定义返回值var sum intfor r_num != 0 {tmp := r_num % 10sum += tmpr_num /= 10}// 想要的结果是Resultr := &Result{job: job,sum: sum,}//运算结果扔到管道resultChan <- r}}(jobChan, resultChan)}
}
http://www.lryc.cn/news/165662.html

相关文章:

  • C++面试/笔试准备,资料汇总
  • 【Unity3D】UI Toolkit数据动态绑定
  • 微信小程序如何在切换页面后原页面状态不变
  • 蓝桥杯官网填空题(生成树)
  • Qt Designer UI设计布局小结
  • linux设备树节点添加新的复位属性之后设备驱动加载异常问题分析
  • 连nil切片和空切片一不一样都不清楚?那BAT面试官只好让你回去等通知了。
  • 前端构建工具 webpack 笔记
  • .Net MVC 使用Areas后存在相同Controller时报错的解决办法; 从上下文获取请求的Area名及Controller名
  • docker-compose部署etcd集群
  • 微信怎么定时发圈?
  • 记录造数据测试接口
  • 数据结构基础7:二叉树【链式结构】实现和递归思想。
  • [.NET 6] IHostedService 的呼叫等等我的爱——等待Web应用准备就绪
  • 基于jeecg-boot的flowable流程自定义业务退回撤回或驳回到发起人后的再次流程提交
  • python如何学习
  • Centos7更新php7.2版本升级
  • 操作系统学习笔记---计算机系统概述
  • uniapp H5 navigateBack无法返回上一层级
  • Android性能优化之应用瘦身(APK瘦身)
  • C语言数组和指针笔试题(二)(一定要看)
  • uniapp——实现在线选座功能——技能提升
  • 领域驱动设计:微服务的各种边界
  • MySQL之数据类型
  • 词法作用域改变词法作用域
  • 关于C++的隐藏 (hidden),重载(overload),重写(override)小结。
  • 算法通关村18关 | 透析回溯的模板
  • 【论文阅读】Untargeted Backdoor Attack Against Object Detection(针对目标检测的无目标后门攻击)
  • 分库分表---理论
  • [golang 流媒体在线直播系统] 2.搭建基于golang的流媒体服务器实现拉流推流,以及Html客户端拉取hls类型的流