假如我有100个任务需要执行,但是我只想同时并发40个,因此我想先并发执行前40个,等这40个都执行完了之后在执行40个,等这40个执行完后再执行最后的20个。想到这我就想到了搞一个“协程池”,不知道go有没有类似的开源的协程池项目有?或者有不用协程池也能解决的方案?
假如我有100个任务需要执行,但是我只想同时并发40个,因此我想先并发执行前40个,等这40个都执行完了之后在执行40个,等这40个执行完后再执行最后的20个。想到这我就想到了搞一个“协程池”,不知道go有没有类似的开源的协程池项目有?或者有不用协程池也能解决的方案?
可以用channel + waitgroup, 大概思路如下
// 每轮任务个数
const Speed = 40
// 任务总数
const total = 100
// 任务
tasks := make([]interface{}, 0)
taskChan := make(chan interface{}, Speed)
// 已执行任务个数
executedNum := 0
wg := &sync.WaitGroup{}
go func() {
for {
num := total - executedNum
if num <= 0{
return
}
if num > Speed {
executedNum += Speed
num = Speed
}
wg.Add(num)
for i := 0; i < num; i++ {
task := <-taskChan
go func(task interface{}) {
defer wg.Done()
task.Do()
}(task)
}
wg.Wait()
}
}()
for i := 0; i < len(tasks); i++ {
taskChan <- tasks[i]
}
7 回答5.4k 阅读
6 回答6.9k 阅读✓ 已解决
4 回答2.4k 阅读
1 回答3.4k 阅读
2 回答939 阅读✓ 已解决
2 回答2.3k 阅读
1 回答2.2k 阅读