使用背景
我们经常遇到需要同时执行耗时的IO请求或数据处理等场景,需要用到协程来达到高效率,但又需要控制协程执行过程的量,防止资源过载,让效率和资源达到最优状态,这就是分段执行的价值。
一般实现的方式主要有两种:
1、需要获取执行结果,在协程内将执行结果写入chan,并在分段创建协程后,使用for循环从chan取出结果,当协程未执行完,则阻断,直到全部取出后再次创建下一分段协程任务。
2、无需获取执行结果,则可简化调用,使用sync.WaitGroup 控制协程分段执行。
1、通过chan获取执行结果实现
// Concurrency 并发处理数据、获取数据
// count 总记录数
// size 每次执行数
// unitLimit 单元并发数
// input 数据写chan
// output 获取chan数据
func Concurrency[T any](count int64, size int, unitLimit int, input func(page int, size int) T, output func(data T)) {
ch := make(chan T, unitLimit)
defer close(ch)
pCount := int(math.Ceil(float64(count) / float64(size)))
// 执行计数器,每次执行一个绥中周期消费
stepRunCount := 0
stepCount := int(math.Ceil(float64(pCount / unitLimit)))
stepStateCount := 0
for i := 0; i < pCount; i
标签:协程,分段,unitLimit,int,chan,golang,执行,size
From: https://blog.csdn.net/jamlin456/article/details/142900633