如何在Go语言中并行运行for循环内的方法?

huangapple go评论131阅读模式
英文:

How to run a method inside for loop in parallel in go?

问题

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

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

我提到的代码如下所示:

  1. for keyString, sliceValue := range mapWithKeyStringAndSliceValue {
  2. result, err := process(keyString, sliceValue)
  3. // 在此之后还有其他代码
  4. }

如上所述,process函数应该并行地对所有的sliceValue执行。

我查看了这个问题以获取一些思路,但它执行的操作有些不同。我对通道和Go协程还不太熟悉,希望能得到任何帮助!

英文:

I have a for loop which iterates over a map of a string as key (keyString) and a slice of type Data (sliceValue) as values. Inside that for loop I have a function process() that takes the sliceValue and keyString and does some operation on it.

I want the process function to be executed in parallel for all slices.

The code that I am mentioning is like this:

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

As I mentioned above, the process function should be executed in parallel for all the sliceValues.

I looked at this question to get some idea but it has a bit different operation to do. I am new to channel and go routines and would appreciate any help!

答案1

得分: 3

使用sync.WaitGroup和在循环内部执行处理的方式来处理Go函数。

  1. wg := new(sync.WaitGroup)
  2. for keyString, sliceValue := range mapWithKeyStringAndSliceValue {
  3. wg.Add(1)
  4. // 将你的sliceValue类型替换为interface{}
  5. go func(keyString string, sliceValue interface{}, wg *sync.WaitGroup) {
  6. defer wg.Done()
  7. result, err := process(keyString, sliceValue)
  8. // 在此之后还有其他代码
  9. }(keyString, sliceValue, wg)
  10. }
  11. wg.Wait()
英文:

Use sync.WaitGroup and do process inside the loop in go func.

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

huangapple
  • 本文由 发表于 2021年6月7日 20:50:52
  • 转载请务必保留本文链接:https://go.coder-hub.com/67871953.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定