【问题标题】:GO - subroutine behaviour in a for loopGO - for 循环中的子程序行为
【发布时间】:2014-04-06 13:27:54
【问题描述】:

我对我对 for 循环中 go 子例程的行为的理解有些怀疑。

据我了解,当我们有一个 for 循环时:

for key := range Map {
   go subroutine(Map[key])
}

Map 有 3 个 (key,Value) 对。

所以我的理解是 subroutine() 函数将使用所有 Map[Key] 值同时运行,即 subroutine(Map[key1]),subroutine(Map[key2]) 和 subroutine(Map[key3]) 都会同时运行?

我对 for 循环中并发子例程的理解正确吗?

谢谢!

【问题讨论】:

  • 除了是/否答案之外,您还在寻找什么? (答案是肯定的)。
  • 如果我的理解不正确,我只想确认或更正。谢谢!
  • 是的,如果没有等待子程序完成,您的程序可以/将在子程序完成之前退出
  • 如果 maxprocs 为 1,您可能会遇到一些问题。 golang.org/pkg/runtime/#GOMAXPROCS

标签: for-loop concurrency go behavior subroutine


【解决方案1】:

是的。请记住,在程序结束之前,您仍然需要活着的主 goroutine 才能完成这些。你可以使用类似 sync.WaitGroup 的东西:

wg := new(sync.WaitGroup)
for key := range Map {
  wg.Add(1)
  go func() {
    subroutine(Map[key])
    wg.Done()
  }
}
wg.Wait()

或者,如果您在主程序中有类似服务器循环的事情,您可能根本不需要它,因为您的程序在相关信号被外部发送到它之前不会完成。

希望对您有所帮助。

【讨论】:

  • 感谢您的回答,但我认为应该在匿名函数内部使用“defer wg.Done()”,否则如果子例程抛出错误,它将被忽略
猜你喜欢
  • 2020-02-05
  • 1970-01-01
  • 2016-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多