为什么使用Goroutine执行函数和普通for循环耗时完全相同?
原因分析
- 核心问题是
sync.WaitGroup的Wait()调用位置错误:你将wg.Wait()放在了for循环内部,每遍历一个元素提交任务后,会立刻阻塞等待当前这一个任务执行完成,才会进入下一次循环。这种写法本质上还是串行执行所有createVirtualServices调用,完全没有利用到goroutine的并发能力,因此耗时和同步遍历执行完全一致。 - 次要排查点:你代码中用到的
limit.Execute如果是并发数限流器,若其配置的最大并发数为1,也会导致所有任务串行执行,但这个问题的优先级低于Wait位置错误的问题。
修正方案
将wg.Wait()移动到for循环外部,等所有任务都提交完成之后再统一等待所有任务执行完成,示例代码如下:
var data map[string]string for _, data = range MapList { wg.Add(1) limit.Execute(func() { go func(data map[string]string) { defer wg.Done() _,_ = m.createVirtualServices(ctx, data, namespace) }(data) }) } // 所有任务提交完成后再统一等待 wg.Wait()
如果limit.Execute本身已经会异步执行传入的函数,也可以检查是否不需要额外再套一层goroutine,避免不必要的资源浪费。
内容的提问来源于stack exchange,提问作者Arsen
相关产品推荐
相关产品推荐

