【问题标题】:Goroutine is taking same time to execute my function as for loopGoroutine 花费与 for 循环相同的时间来执行我的函数
【发布时间】:2021-11-19 21:59:39
【问题描述】:

我有一个创建 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 并执行我的函数,这将花费完全相同的时间来执行。

为什么?

【问题讨论】:

    标签: go concurrency


    【解决方案1】:

    因为您正在等待 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
    

    【讨论】:

    • 我可以看到我的函数现在以不同的方式执行,不是按照 mapList 的顺序,而是使用不同时间创建的对象。仍然需要相同的时间
    • 1min13s - 与 for 循环同时记录
    • 但我会接受它作为正确答案,因为它成功了。但可能是由于 kube-api 服务器客户端限制
    • limit.Execute 可能是同步的。见stackoverflow.com/a/69359178/12301864
    【解决方案2】:

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

    【讨论】:

    • 谢谢让我试试,我会报告
    • @Arsen 这是否有助于减少时间?
    猜你喜欢
    • 1970-01-01
    • 2019-01-31
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 2022-01-20
    • 2017-08-27
    • 1970-01-01
    • 2021-06-05
    相关资源
    最近更新 更多