【问题标题】:When main exits, do goroutines run defer()?当 main 退出时,goroutine 会运行 defer() 吗?
【发布时间】:2019-12-17 01:04:30
【问题描述】:

如果我有一个 goroutine,我可以使用类似的方法关闭我在该 goroutine 上打开的频道吗?

defer(close())

或者当 main 退出时,goroutines 没有运行 defer 语句?

【问题讨论】:

  • 必须同步程序退出顺序。
  • 当主通道退出时通道就消失了,所以在退出时关闭它是多余的。
  • defer 非 main go 例程中的语句在 main 终止时不会执行。当 main 终止时,所有其他正在运行的 go 例程都被中断并在停止时终止。他们不执行defer 指令。请注意,main 终止时不需要关闭通道。
  • 首先要了解:goroutines never run defer() defer() 在函数退出时运行,这与 goroutine 退出时完全不同。
  • @Flimzy,但是当你启动一个 goroutine 时,go 明确要求它是一个函数调用。即使你使用go func,你也必须用括号结束它go func {...}()

标签: go channel deferred goroutine


【解决方案1】:

不,你不能。一旦main 完成,整个程序就会终止。因此,如果确实需要,您必须手动同步优雅终止。有整齐的图案,但那是另一回事了。

但您似乎根本不需要关闭。保持通道开放很好,它们是完全托管的资源,最终将被垃圾收集。关闭更多的是一种设计/意图行为,而不是必要的清理。

附:如果您在main 的级别上defer something(),那么实际上something 将在main 返回后执行。您可能会依赖这种行为。

【讨论】:

  • 他们正在谈论关闭退出,所以不,他们不会被垃圾收集。它们会消失,就像应用程序退出时内存中的其他所有内容一样。
  • @Adrian,当然,我提出了更广泛的范围,只是为了澄清chan 的性质。
猜你喜欢
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-12
  • 1970-01-01
相关资源
最近更新 更多