博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
go简单协程池实现
阅读量:4099 次
发布时间:2019-05-25

本文共 1456 字,大约阅读时间需要 4 分钟。

 为防止无限制开启gorouting造成的cpu性能浪费以及更严重的内存溢出和程序崩溃,这里加单实现一下协程池

深入理解:

流程图:

代码实现: 

package mainimport (	"fmt"	"time")//----------------------有关任务的功能-----------//定义一个任务类型type Task struct {	f func() error //一个Task里有一个具体的业务,业务名称叫f}//创建一个Task任务func NewTask(arg_f func() error) *Task {	return &Task{f:arg_f}}//task执行业务的方法func (t *Task) Execute() {	err := t.f() //真正执行具体业务	if err != nil {		fmt.Println("任务出错:", err)	}}//----------------------有关协程池Pool的功能-----------//定义协程池type Pool struct {	//对外的task入口	EntryChannel chan *Task	//内部的task队列	JobsChannel chan *Task	//协程池中worker数量	worker_num int}//创建协程池func NewPool(cap int) *Pool{	return &Pool{		EntryChannel:make(chan *Task),		JobsChannel:make(chan *Task),		worker_num:cap,	}}//协程池创建一个worker,让这个worker取队列里拿任务执行func (p *Pool) startOneWorker(worker_ID int){	//一直永久地从JobsChannel取任务	for task := range p.JobsChannel {		//取到任务后开始执行		task.Execute()		fmt.Println("worker_ID ",worker_ID, " 执行完了一个任务!")	}}//启动协程池func (p *Pool) run() {	//根据worker_num创建worker	for i := 0; i < p.worker_num; i++ {		//启动自定数量的工人,并开始执行任务		go p.startOneWorker(i)	}	//从EntryChannel中取任务,将新任务发给内部队列JobsChannel	for task := range p.EntryChannel{		p.JobsChannel <- task	}}func main() {	//1.创建一些任务。这里示例用循环重复一个任务	t := NewTask(func() error {		fmt.Println(time.Now())		return nil	})	//2.创建容量为4的协程池	p := NewPool(4)	task_num := 0	//3.将任务放入协程池外部接口	go func() {		for {			p.EntryChannel <- t			task_num ++			fmt.Println("当前一个执行了 ",task_num," 个任务!")		}	}()	//4.启动pool	p.run()}

 

转载地址:http://gzwsi.baihongyu.com/

你可能感兴趣的文章
【JAVA数据结构】双向链表
查看>>
【JAVA数据结构】先进先出队列
查看>>
谈谈加密和混淆吧[转]
查看>>
乘法逆元
查看>>
Objective-C 基础入门(一)
查看>>
通过mavlink实现自主航线的过程笔记
查看>>
Flutter Boost的router管理
查看>>
Vue2.0全家桶仿腾讯课堂(移动端)
查看>>
React+Redux系列教程
查看>>
19 个 JavaScript 常用的简写技术
查看>>
iOS开发支付集成之微信支付
查看>>
React非嵌套组件通信
查看>>
浏览器兼容性问题解决方案 · 总结
查看>>
一个很棒的Flutter学习资源列表
查看>>
为什么你应该放弃React老的Context API用新的Context API
查看>>
Koa2初体验
查看>>
Koa 2 初体验(二)
查看>>
Koa2框架原理解析和实现
查看>>
C++模板
查看>>
【C#】如何实现一个迭代器
查看>>