【问题标题】:Is main just a normal goroutine?main 只是一个普通的 goroutine 吗?
【发布时间】:2017-05-01 00:15:38
【问题描述】:

我目前正在阅读 Go 并发模式 的片段。我对slide #16 上的声明之间的看似矛盾感到有些困惑:

当 main 返回时,程序退出并带走无聊的函数。

另一个在slide #19 上(与example on slide #20 结合使用):

Go 中的通道提供两个 goroutine 之间的连接,允许它们进行通信。

如果main 只是一个goroutine,它怎么会导致任何另一个(生成的)goroutine停止,换句话说:在什么意义上名为main的goroutine是特殊的?*


* 我搜索了它,但到目前为止没有发现任何明显的启发性;标题为 Difference between the main goroutine and spawned goroutines of a Go program 的 SO 问题提出了一个完全不同的问题。

编辑: 更改了标题,重点关注 main 和“普通”goroutine 之间的区别(在偶然发现 Go 运行时函数 Goexit 之后)

编辑:简化问题,更加专注于 main 的细节

【问题讨论】:

  • “它如何控制另一个 goroutine”是什么意思?似乎没有提到 goroutine 控制其他东西。请注意,当程序从 main() 返回时,整个进程都会终止/退出。 main() 几乎“只是”一个 gouroutine。但它很特别,因为这是整个程序的执行开始的地方(除了正在运行的任何 init() 函数),当 main() 结束时,进程终止。
  • 运行时会创建一个goroutine并用它调用main。当 main 返回时,运行时将退出。就像大多数编程语言一样:从 main 返回退出程序,而不管您可能产生的任何线程。
  • 谁说main 是一个goroutine?
  • @RickyA,我是新手,你现在让我很困惑!我正在阅读的书(Go 中的编程 - Mark Summerfield)说:“goroutine 是一个函数或方法调用,它与程序中的任何其他 goroutine 相关地独立和并发执行。每个 Go 程序至少有一个 goroutine,主主包的 main() 函数在其中执行的 goroutine。...".
  • @Wolf: 见golang-book.com/books/intro/10,“第一个goroutine是隐式的,是main函数本身”。

标签: go terminology goroutine


【解决方案1】:

我认为您需要将 goroutine 的影响与进程的影响分开考虑。

main() 函数是一个 goroutine(或者如果你想真正挑剔,从隐式创建的 goroutine 调用)。使用 go 创建其他 goroutine。从main() 返回会终止它的 goroutine,但也会终止整个进程(以及所有其他 goroutine)。也可以通过从任何 goroutine 调用 os.Exit() 或类似方法来终止整个进程。

【讨论】:

  • It is also possible to terminate the process as a whole by calling os.Exit() or similar from any goroutine. -- 感谢您提到这个细节,这将是我的下一个问题(不要惊慌,不要这样;))
  • 值得注意的是,通过使用runtime.Goexit(),也完全可以在不终止程序的情况下终止main()函数goroutine(假设还有其他goroutines处于活动状态)。
  • @Kaedys runtime.Goexit()
  • @Wolf 是的,但如果你可以安排另一个 go-routine 调用os.Exit(),我认为它是安全的。
  • @Wolf 哦,当然。并不是说这是一种干净的处理方式,只是指出主例程的工作方式与任何其他例程一样,能够在不隐式终止整个进程的情况下终止它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-02
  • 1970-01-01
  • 1970-01-01
  • 2013-08-12
  • 2020-01-03
  • 1970-01-01
相关资源
最近更新 更多