代码仓库
goroutine-pool
golang的协程管理
golang协程机制很方便的解决了并发编程的问题,但是协程并不是没有开销的,所以也需要适当限制一下数量。
不使用协程池的代码(示例代码使用chan实现,代码略啰嗦)
func (p *converter) upload(bytes [][]byte) ([]string, error) { ch := make(chan struct{}, 4) wg := &sync.WaitGroup{} wg.Add(len(bytes)) ret := make([]string, len(bytes)) // 上传 for index, item := range bytes { ch <- struct{}{} go func(index int, imageData []byte) { defer func() { wg.Done() <-ch }() link, err := qiniu.UploadBinary(imageData, fmt.Sprintf("%d.png", time.Now().UnixNano())) if err != nil { log.Println("上传图片失败", err.Error()) return } ret[index] = link }(index, item) } wg.Wait() return ret, nil }
需要实现的需求有两个:
限制最大协程数,本例为4
等待所有协程完成,本例为bytes切片长度
使用协程池的代码
func (p *converter) upload(bytes [][]byte) ([]string, error) { ret := make([]string, len(bytes)) pool := goroutine_pool.New(4, len(bytes)) for index, item := range bytes { index := index item := item pool.Submit(func() { link, err := qiniu.UploadBinary(item, fmt.Sprintf("%d.png", time.Now().UnixNano())) if err != nil { log.Println("上传图片失败", err.Error()) return } ret[index] = link }) } pool.Wait() return ret, nil }
可以看到最大的区别是只需要关注业务逻辑即可,并发控制和等待都已经被协程池接管
总结
以上所述是小编给大家介绍的golang 40行代码实现通用协程池,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对小牛知识库html" target="_blank">网站的支持!
本文向大家介绍C#的Socket实现UDP协议通信示例代码,包括了C#的Socket实现UDP协议通信示例代码的使用技巧和注意事项,需要的朋友参考一下 今天稍花化了一点时间,利用C#的Socket验证了UDP的通信,为接下来特地利用UDP做个分布式的通信仿真系统打下基础。众所周知,UDP 就是用户数据报协议,在互联网参考模型的第四层——传输层。与TCP协议同层,都是提供信息的传输服务,但与TCP最
问题内容: 这个问题与我有关Java中现有协程实现的问题有关。如我所怀疑的,如果事实证明Java中尚没有完整的协程实现,那么实现这些协程将需要什么? 正如我在该问题中所说的,我了解以下内容: 您可以将“协程”实现为后台的线程/线程池。 您可以在后台使用JVM字节码来完成棘手的事情,以使协程成为可能。 所谓的“达芬奇机” JVM实现具有使协程在无需字节码操作的情况下就可以实现的原语。 也有多种基于J
本文向大家介绍Android通用索引栏实现代码,包括了Android通用索引栏实现代码的使用技巧和注意事项,需要的朋友参考一下 偶尔看到之前写过的代码,感觉好多东西几乎在很多项目中都要用到,虽然每个项目的需求和设计都不同,不过实现的效果都是一样的,可能只是数据格式和一些颜色等的细微差距.但是有的时候因为一个小改变,就要去重复的修改代码,麻烦不说,也容易导致新的问题和BUG. 就拿忽然想到的索引栏来
本文向大家介绍用python实现的线程池实例代码,包括了用python实现的线程池实例代码的使用技巧和注意事项,需要的朋友参考一下 python3标准库里自带线程池ThreadPoolExecutor和进程池ProcessPoolExecutor。 如果你用的是python2,那可以下载一个模块,叫threadpool,这是线程池。对于进程池可以使用python自带的multiprocessing
本文向大家介绍jQuery实现div随意拖动的实例代码(通用代码),包括了jQuery实现div随意拖动的实例代码(通用代码)的使用技巧和注意事项,需要的朋友参考一下 注意js放的位置,要放的靠近,若被其他覆盖,则无法移动。 比如: 引入jquery.js, jquery-ui.js, 一句: 如希望,点住时鼠标变手形: 下面给大家分享一段通用代码jquery实现拖动div的通用方法
本文向大家介绍Nodejs+Socket.io实现通讯实例代码,包括了Nodejs+Socket.io实现通讯实例代码的使用技巧和注意事项,需要的朋友参考一下 目录结构 需要的条件 socket.io.js 供前端界面初始化io socket.io 供NodeJs端提供socket方法 socket.io.js存在于socket.io-client socket.io存在于socket.io 演示