通过channel控制goroutine数量形成协程池

还需要多加强并发编程能力

最近业务上需要利用大量开goroutine去并发拉取数据,但是不能无限制的 for 数据长度来开启那么多的goroutine,就要写个协程池来协调,通过channel来限制goroutine的开启数量。 业务需求: 需要生产者去每日定时拉去第三方平台数据,放入到channel缓存通道中(类型存入消息队列),消费者需要开goroutine并发的进行拉取第三方平台数据整合后再插入表中,其中goroutine开启数与channel缓存接受到的数据之间形成了协程池,从而通过了channel控制goroutine开启的数据(原理就是带缓存channel不够时会阻塞,当缓存满时也会阻塞等待消费) 代码详解: 首先声明相关变量常量等数据: 假设拉取数据可达到10W条: const ( channelBufferSize = 1000 // channel 缓存数 goSize = 100 // 协程开启 最大数 ) // 声明一个用于定义channel的结构体 type Job struct { BucketName string // 存放 bucket 名称 Count int // 计算 重试次数 } // 全局声明该 带缓存的 channel var channlBucket = make(chan *Job, channelBufferSize) 构建生产者: func Producer() (err error) { // 获取第三方业务相关数据,用于消费者函数调用的参数 bucketNameList, err := qiniu.GetV2sBucketNameList() if err ! [Read More]