Goroutine 与 for 循环同时执行我的函数

Goroutine is taking same time to execute my function as for loop

我有一个创建 Istio VirtualService 对象的函数。 我正在使用 goroutines 并发执行我的功能,启动 100 个工人。

            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()
            }

如果我只是循环遍历 seMapList 并执行我的函数,这需要完全相同的时间来执行。

为什么?

因为您正在等待 goroutine 在启动后立即完成。试试这个:

            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() // Wait for them after all goroutines are created

@Burak Serdan 的回答是正确的,但在这种情况下可能不是。据我所知,您将匿名函数传递给 limit.Execute,因此您的匿名函数将真正启动新的 goroutine,但不会立即启动,但在 limit.Execute 之后将在内部某处调用此匿名函数。

但是你可以传递一个函数,而不是传递 N 个匿名函数,然后这个函数将运行 N 个 goroutines

var data map[string]string

limit.Execute(func() {
    for _, data = range MapList {
        wg.Add(1)
        go func(data map[string]string) {
            defer wg.Done()
            _,_ = m.createVirtualServices(ctx, data, namespace)
        }(data)
    }
})
wg.Wait()