协程池的核心是控制协程数量,对于简单需求不一定需要协程池,反而让程序复杂了,增加不透明度。几种典型场景
1.简单的可以直接起固定个数协程处理
- 优点是简单,不复杂的并发任务这样简单处理即可。
- 缺点在于dataChan可能流量不不均衡,需要同时处理的任务多少在变动,但是对应的协程数量保持不变,要不就是任务处理堵塞要不就是存在多余的协程空闲。
// runBoundedTask 起maxTaskNum个协程共同处理任务
func runBoundedTask(dataChan
2.复杂点的可以基于Semaphore动态调整处理任务的协程数
针对固定个数协程的缺点,一个思路是协程数量最好能够根据来的处理任务的多少,动态变更,指定一个并发上限,任务多时增加协程数量,任务少时减少协程数量。
// runSemaphoreTask
// 最大同时运行maxTaskNum个任务处理数据
// 使用信号量维持maxTaskNum个信号
func runSemaphoreTask(dataChan
3.终极方案直接上协程池
针对复杂业务,可以直接上协程池。
常用协程池https://github.com/panjf2000/ants,如下实现。
// runGoroutinePoolTask 使用协程池动态管理协程数量
func runGoroutinePoolTask(dataChan
更多细节参考
文章来源于互联网:Golang 开发需要协程池吗?