李海彬
【Golang语言社区投稿】golang高并发基于协程,通道的任务池
关注作者
前往小程序,Get
更优
阅读体验!
立即前往
腾讯云
开发者社区
文档
建议反馈
控制台
登录/注册
首页
学习
活动
专区
工具
TVP
最新优惠活动
文章/答案/技术大牛
搜索
搜索
关闭
发布
首页
学习
活动
专区
工具
TVP
最新优惠活动
返回腾讯云官网
李海彬
首页
学习
活动
专区
工具
TVP
最新优惠活动
返回腾讯云官网
社区首页
>
专栏
>
【Golang语言社区投稿】golang高并发基于协程,通道的任务池
【Golang语言社区投稿】golang高并发基于协程,通道的任务池
李海彬
关注
发布于 2018-03-27 10:22:01
1.4K
0
发布于 2018-03-27 10:22:01
举报
文章被收录于专栏:
Golang语言社区
要点: 封装了协程模型基于select模型的通道传递; 支持同步和异步添加任务;由于golang无函数指针,任务函数利用了go 反射机制支持可变参的入参 开发者可以在高处理性能前提下,只专注业务开发,往任务池添加任务即可。 实例: //taskpool.go package taskpool import ( "reflect" "time" ) type Task struct { M_func interface{} M_args []interface{} } func (task *Task) Run() { go func() { f := reflect.ValueOf(task.M_func) if len(task.M_args) != f.Type().NumIn() { return } in := make([]reflect.Value, len(task.M_args)) for k, param := range task.M_args { in[k] = reflect.ValueOf(param) } f.Call(in) }() } type WorkPool struct { TaskChannel chan Task QuitChan chan int //终止通道 } //size 设置缓存大 func (pool *WorkPool) InitPool(size int) { pool.TaskChannel = make(chan Task, size) pool.QuitChan = make(chan int) go func() { DONE: for { select { case task := <-pool.TaskChannel: task.Run() case <-pool.QuitChan: break DONE } } }() } func (pool *WorkPool) ClosePool() { pool.QuitChan <- 1 } //同步阻塞方式添加任务 func (pool *WorkPool) AddTask(task Task) { pool.TaskChannel <- task } //非阻塞方式添加任务 time 超时时间 单位毫秒 func (pool *WorkPool) AddTaskSync(task Task, millitime int) bool { res := false go func(res bool) { select { case pool.TaskChannel <- task: res = true case <-time.After(time.Millisecond * time.Duration(millitime)): res = false } }(res) return res } //test_main.go package main import ( "fmt" "ms_lib/ms_taskpool" "time" ) func test(i int, test string) { fmt.Println("hahaha", i, test) } func main() { task_pool := ms_taskpool.WorkPool{} task_pool.InitPool(5) for i := 0; i < 1000; i++ { task := ms_taskpool.Task{M_func: test} task.M_args = append(task.M_args, i) task.M_args = append(task.M_args, "test") task_pool.AddTask(task) } //task_pool.ClosePool() //可强制主动关闭任务池 time.Sleep(5 * time.Second) fmt.Println("test done!") }
本文参与
腾讯云自媒体同步曝光计划
,分享自微信公众号。
原始发表:2017-05-20,如有侵权请联系
cloudcommunity@tencent.com
删除
go
本文分享自
Golang语言社区
微信公众号,
前往查看
如有侵权,请联系
cloudcommunity@tencent.com
删除。
本文参与
腾讯云自媒体同步曝光计划
,欢迎热爱写作的你一起参与!
go
评论
登录
后参与评论
0 条评论
热度
最新
推荐阅读
LV.
文章
0
获赞
0
领券
问题归档
专栏文章
快讯文章归档
关键词归档
开发者手册归档
开发者手册 Section 归档
0
0
0
推荐