goroutine池的应用

  • 本质上是生产者消费者模型
  • 可以有效控制goroutine数量,防止暴涨
  • 需求:
    • 计算一个数字的各个位数之和,例如数字123,结果为1+2+3=6
    • 随机生成数字进行计算
  • 控制台输出结果如下:
job id: 164362 random: 3002688297310473558 result: 81
job id: 164363 random: 8188014692039052954 result: 84
job id: 164364 random: 9199514953162082256 result: 87
job id: 164365 random: 6547609431377245779 result: 96
job id: 164366 random: 5158862497998501304 result: 94
job id: 164367 random: 7591045689235318611 result: 84
job id: 164368 random: 4913457935486468007 result: 93
job id: 164369 random: 6484925446766292271 result: 94
job id: 164370 random: 1630566468428792798 result: 101
job id: 164371 random: 3999715154713986432 result: 96
job id: 164372 random: 8436839935373284876 result: 106
job id: 164373 random: 7590654756672405712 result: 88
job id: 164374 random: 5127823813978664887 result: 103
job id: 164375 random: 5630536624069526117 result: 77
job id: 164376 random: 3445557283367509019 result: 86
job id: 164377 random: 6087330610397339825 result: 83
job id: 164378 random: 3391465925899927215 result: 99

main.go

package mainimport ("fmt""math/rand"
)type Job struct {Id intRandom int
}type Result struct {job *Jobsum int
}func createGoroutinePool(goNum int, jobChan chan *Job, resultChan chan *Result){// 根据goNum开启多个goroutine执行for i := 0; i < goNum; i++ {go func(jobChan chan *Job, resultChan chan *Result) {// 处理每个jobChan中的数据并返回结果for job := range jobChan{random := job.Randomvar sum int// 计算每一位的和for random != 0 {tmp := random % 10sum += tmprandom /= 10}// 组织返回结果r := &Result{job: job,sum: sum,}// 将结果写入通道resultChan<- r}}(jobChan, resultChan)}
}func main() {// 工作通道jobChan := make(chan *Job, 128)// 结果通道resultChan := make(chan *Result,128)// 创建工作池执行任务createGoroutinePool(64, jobChan, resultChan)// 打印结果通道数据go func(resultChan chan *Result){for result := range resultChan{fmt.Printf("job id: %v random: %v result: %d\n", result.job.Id, result.job.Random, result.sum)}}(resultChan)var id intfor {id++r_num := rand.Int()job := &Job{Id:     id,Random: r_num,}jobChan<-job}
}

Goroutine池相关推荐

  1. Goroutine 并发调度模型深度解析之手撸一个高性能 goroutine 池

    文章目录 1 前言 2 Goroutine & Scheduler 2.1 线程那些事儿 2.1.1 用户级线程模型 2.1.2 内核级线程模型 2.1.3 两级线程模型 2.2 G-P-M ...

  2. 高性能goroutine池---ants(2.5.0) 源码解析

    引言 ants是一个高性能的 goroutine 池,实现了对大规模 goroutine 的调度管理.goroutine 复用,允许使用者在开发并发程序的时候限制 goroutine 数量,复用资源, ...

  3. go语言中goroutine池

    创建三个goroutine,创建5个任务,用三个goroutine干5个任务 package mainimport ("fmt""time" )func wor ...

  4. Goroutine并发调度模型深度解析之手撸一个协程池

    Goroutine & Scheduler Goroutine,Go语言基于并发(并行)编程给出的自家的解决方案.goroutine是什么?通常goroutine会被当做coroutine(协 ...

  5. Go:goroutine线程池 ants 简介与实践

    文章目录 简介 一.功能介绍 二.处理流程 三.示例 小结 简介 github地址: https://github.com/panjf2000/ants ants是一个高性能的 goroutine 池 ...

  6. 十、Go协程的调度,互斥锁,计数器和线程池

    @Author:Runsen 在字节面试中,我见过:GO语言中的协程与Python中的协程的区别?其实就是要我讲解Go中GMP机制.我表示很多都用过,但是底层不了解. 那时我只知道与传统的系统级线程和 ...

  7. 【Java并发编程】并发之痛 Thread,Goroutine,Actor

    本文基于我在2月27日Gopher北京聚会演讲整理而成,进行了一些补充以及调整.投稿给<高可用架构>公众号首发. 聊这个话题之前,先梳理下两个概念,几乎所有讲并发的文章都要先讲这两个概念: ...

  8. Golang的协程池设计

    转载地址:https://studygolang.com/articles/15477 使用Go语言实现并发的协程调度池阉割版,本文主要介绍协程池的基本设计思路,目的为深入浅出快速了解协程池工作原理, ...

  9. 白话 Golang 协程池

    文章目录 1.何为并发 2.并发的好处 3.Go 如何并发 4.G-P-M 调度模型 5.Go 程的代价 6.协程池的作用 7.简易协程池的设计&实现 8.开源协程池的使用 9.小结 参考文献 ...

最新文章

  1. FreePascal - 如何在各个平台中安装CodeTyphon!
  2. c++11 多线程传参和生产者消费者实现
  3. c语言银行每月额外存款100,C语言课程设计_银行存取款业务.doc
  4. rust(70)-条件表达式
  5. oshi.systeminfo 获取cpu的数量_智能IC/CPU卡梯控系统的功能优势
  6. iOS开发日记4-第三方登录(ShareSDK)
  7. 披荆斩棘:论百万级服务器反入侵场景的混沌工程实践
  8. nginx http子模块conf的初始化
  9. 中反应器体积_实验室规模半连续和连续生物反应器在微生物学和生物技术工艺中的作用...
  10. IntelliJ IDEA for Mac如何配置数据源(Data Source)和用户驱动(User Driver)及数据库控制台_数据源配置(Console)详解
  11. 2021职场白领健康图鉴.pdf(附下载链接)
  12. [PM2][ERROR] Script not found 和 npm in fork_mode
  13. 【日常】ICS的lab7攻略和最近生活的吐槽
  14. 悉尼大学BUSS6002Assignment1课业解析
  15. uniapp H5端与APP端压缩图片
  16. 知识兔课程揭秘2021抖音卖货代运营的新骗局,你中招了吗?
  17. 大陆期货11月3日钢材日评
  18. java okhhtp下载学信网学籍信息
  19. 上小学的划片政策(by quqi99)
  20. 罗格斯大学计算机信息工程专业排名,罗格斯大学硕士统计学专业排名?这一些重点迟早得掌握...

热门文章

  1. oracle 202,Oracle Certification 1Z0-202题库
  2. servlet指定时间到现在过了多久_就喝一瓶啤酒,多久能开车?交警:过了这个时间,100%没问题...
  3. ML之kNNC:基于iris莺尾花数据集(PCA处理+三维散点图可视化)利用kNN算法实现分类预测
  4. AI:人工智能概念之机器学习ML、深度学习DL、数据挖掘、知识发现、模式识别等重要领域之间比较关系结构图之详细攻略
  5. CV之CycleGAN:CycleGAN算法相关思路配图、论文集合
  6. 最大信息系数MIC--minepy安装
  7. 替换UI--遮挡问题
  8. Http请求Response Code含义
  9. C#事件与委托的区别
  10. su 与 sudo 区别