【问题标题】:How to run a method inside for loop in parallel in go?如何在go中并行运行for循环内部的方法?
【发布时间】:2021-08-24 13:22:48
【问题描述】:

我有一个 for 循环,它遍历作为键 (keyString) 的字符串映射和作为值的类型为 Data (sliceValue) 的切片。在那个 for 循环中,我有一个函数 process(),它接受 sliceValuekeyString 并对其进行一些操作。

我希望对所有切片并行执行 process 函数。

我提到的代码是这样的:

for keyString, sliceValue := range mapWithKeyStringAndSliceValue {
     result, err := process(keyString, sliceValue)
     // some other code after this
}

正如我上面提到的,process 函数应该为所有 sliceValues 并行执行。

我查看了这个question 以获得一些想法,但它有一些不同的操作要做。我是频道和例行程序的新手,希望能提供任何帮助!

【问题讨论】:

  • 如果您需要同步 resulterr,则执行 process(...) async 没有优势(实际上是劣势)
  • 如果您不需要收集结果,只需将循环体放入一个函数(命名或匿名)并作为 goroutine 启动即可。如果您需要等待所有已启动的 goroutine 完成,请使用 WaitGroup

标签: for-loop go parallel-processing channel goroutine


【解决方案1】:

使用 sync.WaitGroup 并在 go func 的循环内进行处理。

    wg := new(sync.WaitGroup)
    for keyString, sliceValue := range mapWithKeyStringAndSliceValue {
        wg.Add(1)
        // put your sliceValue type instead of interface{}
        go func(keyString string, sliceValue interface{}, wg *sync.WaitGroup) {
            defer wg.Done()
            result, err := process(keyString, sliceValue)
            // some other code after this
        }(keyString, sliceValue, wg)
    }
    
    wg.Wait()

【讨论】:

  • 如果我想在出错的情况下返回,比如if err != nil,我想返回这个错误或if result == nil,那么我希望循环继续
  • 在每次迭代中打开 go 例程时,继续循环是无用的。如果需要在每次迭代中处理错误,则需要进行通道操作或按顺序进行。
猜你喜欢
  • 2017-04-18
  • 1970-01-01
  • 2014-04-13
  • 2011-12-10
  • 2016-05-27
  • 2012-05-19
  • 2016-11-14
  • 1970-01-01
  • 2022-01-25
相关资源
最近更新 更多