前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Golang语言社区投稿】golang高并发基于协程,通道的任务池

【Golang语言社区投稿】golang高并发基于协程,通道的任务池

作者头像
李海彬
发布2018-03-27 10:22:01
1.4K0
发布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 删除

本文分享自 Golang语言社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档