golang 40行代码实现通用协程池
代码仓库
goroutine-pool
golang的协程管理
golang协程机制很方便的解决了并发编程的问题,但是协程并不是没有开销的,所以也需要适当限制一下数量。
不使用协程池的代码(示例代码使用chan实现,代码略啰嗦)
func(p*converter)upload(bytes[][]byte)([]string,error){ ch:=make(chanstruct{},4) wg:=&sync.WaitGroup{} wg.Add(len(bytes)) ret:=make([]string,len(bytes)) //上传 forindex,item:=rangebytes{ ch<-struct{}{} gofunc(indexint,imageData[]byte){ deferfunc(){ wg.Done() <-ch }() link,err:=qiniu.UploadBinary(imageData,fmt.Sprintf("%d.png",time.Now().UnixNano())) iferr!=nil{ log.Println("上传图片失败",err.Error()) return } ret[index]=link }(index,item) } wg.Wait() returnret,nil }
需要实现的需求有两个:
限制最大协程数,本例为4
等待所有协程完成,本例为bytes切片长度
使用协程池的代码
func(p*converter)upload(bytes[][]byte)([]string,error){ ret:=make([]string,len(bytes)) pool:=goroutine_pool.New(4,len(bytes)) forindex,item:=rangebytes{ index:=index item:=item pool.Submit(func(){ link,err:=qiniu.UploadBinary(item,fmt.Sprintf("%d.png",time.Now().UnixNano())) iferr!=nil{ log.Println("上传图片失败",err.Error()) return } ret[index]=link }) } pool.Wait() returnret,nil }
可以看到最大的区别是只需要关注业务逻辑即可,并发控制和等待都已经被协程池接管
总结
以上所述是小编给大家介绍的golang40行代码实现通用协程池,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。