主页 > 知识库 > golang 40行代码实现通用协程池

golang 40行代码实现通用协程池

热门标签:建造者2地图标注 阿里云ai电话机器人 滨州自动电销机器人排名 钉钉有地图标注功能吗 浙江高频外呼系统多少钱一个月 汕头小型外呼系统 惠州电销防封电话卡 黄冈人工智能电销机器人哪个好 郑州亮点科技用的什么外呼系统

代码仓库

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行代码实现通用协程池,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

您可能感兴趣的文章:
  • golang协程池模拟实现群发邮件功能
  • golang协程池设计详解
  • GO实现协程池管理的方法

标签:泰安 晋中 泸州 沧州 阿坝 驻马店 昭通 东营

巨人网络通讯声明:本文标题《golang 40行代码实现通用协程池》,本文关键词  golang,40行,代码,实现,通用,;如发现本文内容存在版权问题,烦请提供相关信息告之我们,我们将及时沟通与处理。本站内容系统采集于网络,涉及言论、版权与本站无关。
  • 相关文章
  • 下面列出与本文章《golang 40行代码实现通用协程池》相关的同类信息!
  • 本页收集关于golang 40行代码实现通用协程池的相关信息资讯供网民参考!
  • 推荐文章