package mainimport ("fmt""time"
)//创建任务类型
type Task struct {f func() error
}//执行任务
func (t *Task) Execute() {t.f()
}//创建任务对象
func NewTask(f func() error) *Task {t := Task{f: f,}return &t
}//创建任务池
type Pool struct {InChannel  chan *Task //任务队列JobChannel chan *Task //工作队列max        int        //最大消费协程数
}//创建新的任务池
func NewPool(max int) *Pool {p := &Pool{InChannel:  make(chan *Task),JobChannel: make(chan *Task),max:        max,}return p
}//消费工作队列
func (p *Pool) work(id int) {for task := range p.JobChannel {fmt.Printf("%T%v\n", task, id)task.Execute()}
}var (num int = 1
)func (p *Pool) Run() {//开启多个协程消费工作队列for i := 0; i < p.max; i++ {go p.work(i)}fmt.Print("协程写入工作队列start~\n")//从任务队列写入工作队列for task := range p.InChannel {fmt.Println(num)num++p.JobChannel <- task}fmt.Print("协程写入工作队列end~\n")close(p.JobChannel)}//任务入队列
func (p *Pool) TaskInChannel(f *Task) {var second = 0for second < 3 {second++p.InChannel <- f}//遵循是申请谁释放的原则,最好是写入方负责closeclose(p.InChannel)fmt.Println("inChan结束~")
}func main() {//创建新的任务,这里只是打印当前的时间戳f := NewTask(func() error {fmt.Println(time.Now())return nil})//创建新的任务池p := NewPool(3)//开启协程创建任务写入任务队列go p.TaskInChannel(f)//启动p.Run()}

golang 工作池demo相关推荐

  1. 基于golang的爬虫demo,爬取微博用户的粉丝和关注者信息

    基于golang的爬虫demo,爬取微博用户的粉丝和关注者信息 注意:仅供学习交流,任何非法使用与作者无关! 目录 基于golang的爬虫demo,爬取微博用户的粉丝和关注者信息 一.背景与取材 二. ...

  2. swoole-co-pool v1.0.1,Swoole 协程工作池

    百度智能云 云生态狂欢季 热门云产品1折起>>>   介绍 Swoole 协程工作池,它可以限定你的同时工作协程数量,并且减少协程频繁创建销毁的损耗. Gitee:https://g ...

  3. js 获取father_(原创)Node.JS实战26:强大的工作池。收藏吧!你一定会用的到。...

    在实际项目中,如果遇到需要大计算量的操作,按需fork(分叉)其实不是一个好的选择. 因为fork的子进程也是V8(NodeJS的核心引擎)的新实例,每创建一个新实例,需要约30毫秒启动时间,和至少1 ...

  4. 数据库连接池Demo(1)单线程初步

    简介 在上周阅读Alibaba Druid数据库连接池后,感觉光看有点领会不到精髓,后面这几篇文章将尝试自己实现一个数据库连接池Demo 原生JDBC与Alibaba Druid使用 我们先把相关的测 ...

  5. Golang 连接池的几种实现案例

    因为TCP的三只握手等等原因,建立一个连接是一件成本比较高的行为.所以在一个需要多次与特定实体交互的程序中,就需要维持一个连接池,里面有可以复用的连接可供重复使用. 而维持一个连接池,最基本的要求就是 ...

  6. Golang连接池的几种实现案例

    因为TCP的三次握手等等原因,建立一个连接是一件成本比较高的行为.所以在一个需要多次与特定实体交互的程序中,就需要维持一个连接池,里面有可以复用的连接可供重复使用. 而维持一个连接池,最基本的要求就是 ...

  7. java 工作池_Java线程池的工作原理,好处和注意事项

    线程池的工作原理 一个线程池管理了一组工作线程, 同时它还包括了一个用于放置等待执行 任务的任务队列(阻塞队列) . 一个线程池管理了一组工作线程, 同时它还包括了一个用于放置等待执行 任务的任务队列 ...

  8. Golang线程池gpool

    背景 golang中使用并发要考虑很多问题,如控制并发量.等待Goroutine执行完毕等. 看下面一段代码: var wg sync.WaitGroup count := 10 wg.Add(cou ...

  9. golang工作中常用的一些库

    1.json解析 非常好用的json解析工具库 github.com/tidwall/gjson 高性能json库,替代encoding/json https://github.com/json-it ...

最新文章

  1. C++ 通讯录学习总结
  2. 本周 Github 精选:13 款炼丹利器,有开源工具包也有超大数据集
  3. c主线程如何等待子线程结束 linux_使用互斥量进行同步 - Linux C进程与多线程入门_Linux编程_Linux公社-Linux系统门户网站...
  4. C#给字符串赋予字面值——字符串插入、转义序列的使用
  5. C语言约瑟夫报数出圈算法,c语言实现约瑟夫环问题
  6. 系统调用getopt解析
  7. postman下载使用教程
  8. 网易云音乐会员下载正常音乐格式
  9. CCF 2022:DPU评测技术白皮书发布【附白皮书下载】
  10. OFD发票无法打开了
  11. Google Office 战略 途经:收购JotSpot
  12. 排序算法——梳排序 Comb sort
  13. “第三届金融CIO班”开学典礼成功举行
  14. Shell循环语句(for、while、until)及echo、IFS
  15. -2岁的产品经理学习日记2020/2/15
  16. 更改电脑用户名(可更改C:\Users\用户名)
  17. 如何在Windows DOS环境下格式化硬盘
  18. 从中石油辞职好后悔_从石油到移动互联网
  19. Ubuntu 22.04 解决使用 .AppImage 文件方法
  20. #02数据结构练习二

热门文章

  1. 常用的对象处理工具类
  2. mysql的rowscn_Oracle ORA_ROWSCN 伪列 说明
  3. 北京理工大学计算机课答案,北京理工大学计算机专业考研课程模拟试题.doc
  4. php函数实验,PHP函数
  5. 最全的“大数据”学习资源
  6. day14(xml 编写及解析)
  7. Mongodb3.4 复制集及分片配置
  8. Shell脚本里调用Python程序
  9. sysctl修改内核参数
  10. 协程 vs 线程 demo