tnblog
首页
视频
资源
登录

golang 简单的workpool demo

7336人阅读 2021/2/8 12:52 总访问:131425 评论:0 收藏:0 手机
分类: golang
  1. // 实现计算一个数字的各个位数之和如:123=6
  2. // 采用工作池方式
  3. package main
  4. import (
  5. "fmt"
  6. "math/rand"
  7. )
  8. type job struct {
  9. number int
  10. id int
  11. }
  12. type result struct {
  13. job *job
  14. sum int
  15. }
  16. func main() {
  17. j := make(chan *job, 1000)
  18. r := make(chan *result, 1000)
  19. //调用消费者
  20. workpool(128, j, r)
  21. go printResult(r)
  22. //调用生产者
  23. producer(j)
  24. }
  25. //calc 计算函数
  26. func calc(job *job, res chan *result) {
  27. var sum int
  28. number := job.number
  29. for number != 0 {
  30. tmp := number % 10
  31. sum += tmp
  32. number /= 10
  33. }
  34. r := &result{
  35. job: job,
  36. sum: sum,
  37. }
  38. res <- r
  39. }
  40. //消费者work不断从chan管道 中获取所需参数
  41. func work(job chan *job, res chan *result) {
  42. for j := range job {
  43. calc(j, res)
  44. }
  45. }
  46. //workpool 这里不断开启指定个数的goroutine
  47. func workpool(workNum int, job chan *job, res chan *result) {
  48. for i := 0; i < workNum; i++ {
  49. go work(job, res)
  50. }
  51. }
  52. //printResult打印结果
  53. func printResult(result chan *result) {
  54. for r := range result {
  55. fmt.Printf("结果:id=%d,number=%d,计算结果=%d\n", r.job.id, r.job.number, r.sum)
  56. }
  57. }
  58. //producer 生成者
  59. func producer(jobChan chan *job) {
  60. var id int = 0
  61. for {
  62. id++
  63. number := rand.Int()
  64. job := &job{
  65. number: number,
  66. id: id,
  67. }
  68. jobChan <- job
  69. }
  70. }

运行结果如下

评价

golang changouroutine 学习

并发编程多线程 线程是属于操作系统进行管理, 也就是属于内核态线程之间切换, 需要发生用户态和内核态的切换 当系统中...

解决golang go get被墙的问题

解决go get被墙golang我们使用go get命令的时候会出现有些包拉取失败, 这是因为我们国内特殊网络的原因。 解决方案1:设...

简单的加密算法

publicstringEnDecryption(stringstr) { char[]EnStr=str.ToCharArray(); char[]key={&#39;J&#39;,&#39;I&#39;,&#39;A&#...

简单的 行转列

行转列 DECLARE @Str VARCHAR(100) SELECT @Str = &#39;1,2,3,4,5&#39; SELECT b.Line FROM ( SELECT Line = CONVERT(XML,...

handler实现一个简单的验证码

handler代码如下:publicclassCodeHandler:IHttpHandler,IRequiresSessionState { publicvoidProcessRequest(HttpConte...

03--VueJs 的简单的介绍和基本的代码

Vue.js(官网地址:https://cn.vuejs.org/index.html)Vue.js 是目前最火的一个前端框架,除了开发网站,还可以开发手机App,...

vue-cli加入高德地图最简单的方式

vue-cli加入高德地图最简单的方式在这里就不多说怎么搭建vue-cli项目如果不会自行百度即可很多1、打开高德地图开放平台首先...

bootstrap实现一个简单的图书显示

效果如下:代码:代码:&lt;!DOCTYPEhtml&gt; &lt;html&gt; &lt;head&gt; &lt;metacharset=&quot;utf-8&quot;/&gt; &lt...

consul实现简单的服务集群,负载均衡调用

接上一篇,consul要实现简单的服务集群,其实也很简单,只需要把多个服务使用统一个名字注入即可,然后调用的时候通过服务...

Docker部署简单的mysql

Docker部署简单的mysql[TOC] 首先这玩意我是真不想写,网上写的太多了,但是又没有找到快速的创建方式。so…有疑问都可...

.net core 3.1 制作一个简单的依赖注入容器

.net core 3.1 制作一个简单的依赖注入容器[TOC] 依赖注入简介 IOC(控制反转)通过将一组通用的流程的控制权从应用转移到...

BenchmarkDotNet简单的基准测试

BenchmarkDotNet简单的基准测试[TOC] BenchmarkDotNet简单介绍 BenchmarkDotNet 可帮助您将方法转换为基准,跟踪其性能并...

dotnet项目执行shell脚本实现简单的自动化部署

不要k8s、不要docker、不要Jenkins,只要一个部署脚本,只是一个小项目单台服务器,实现提交代码自动执行脚本,拉代码构建...

vue.js几个简单的指令v-bindv-forv-modelv-if

v-bind:你需要绑定的属性名称,可以简写,:属性名称&lt;tdv-bind:vl=&quot;item.Id&quot;&gt;{{item.Id}}&lt;/td&gt; &lt;t...

Mysql简单的数据操作

MySQL数据的简单处理1.创建表类型之约束非空NOT NULL指定列在插入数据时候必须有值非负UNSIGNED/unsigned插入数字不能是负...
无论这个世界对你怎样,都请你一如既往的努力、勇敢、充满希望。
排名
25
文章
22
粉丝
5
评论
7
C# string 和String 的区别
剑轩 : 所以区别主要在哪里呢....
markdown 初步学习
剑轩 : 哇哦,真的喜欢你这个个性签名,很不错
pythoic 写法
剑轩 : 新年快乐啊
python拼接字符串八种
剑轩 : 手动点赞+1
python拼接字符串八种
雨雨雨雨雨辰 : 手动点赞
pythoic 写法
瑾语 : 你好
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术