英文:
Is main just a normal goroutine?
问题
我目前正在阅读《Go并发模式》一书中的章节。我对第16页的一句话感到有些困惑,它与第19页上的另一句话似乎存在矛盾。在第16页上说:
当main函数返回时,程序退出,并将boring函数一同关闭。
而在第19页上(结合第20页上的示例)说:
Go中的通道提供了两个goroutine之间的连接,使它们能够进行通信。
如果main
只是一个goroutine,它如何能够导致其他(派生的)goroutine停止呢?换句话说,main
goroutine有何特殊之处?
我搜索了一下,但没有找到明显有启发性的答案;一个标题有希望的SO问题Go程序中main goroutine和派生的goroutine之间的区别问的是一个完全不同的问题。
编辑: 更改了标题,重点关注main和“普通”goroutine之间的区别(在遇到Go运行时函数Goexit时)。
编辑: 简化问题,更加专注于main的特殊性。
英文:
I'm currently reading the slices of Go Concurrency Patterns. I'm a little bit confused about a seeming contradiction between a statement on slide #16:
> When main returns, the program exits and takes the boring function down with it.
and another one on slide #19 (in combination with the example on slide #20):
> A channel in Go provides a connection between two goroutines, allowing them to communicate.
If main
is just a goroutine, how can it cause any another (spawned) goroutine to stop, in other words: in what sense is the goroutine named main
special?<sup>*</sup>
<sup>*</sup> I searched for it, but found nothing obviously enlightening so far; the SO question with the promising title Difference between the main goroutine and spawned goroutines of a Go program asks for a completely different issue.
edit: changed the title, to focus on the difference between main and "normal" goroutines (after stumbling upon the Go runtime function Goexit)
edit: simplified question, to be even more focused on the specifics of main
答案1
得分: 4
我认为你需要将goroutine的影响与进程的影响分开考虑。
main()
函数是一个goroutine(或者如果你想要更准确的说法,是从一个隐式创建的goroutine中调用的)。使用go
关键字可以创建其他的goroutine。从main()
函数返回会终止它所在的goroutine,同时也会终止整个进程(因此也会终止所有其他的goroutine)。还可以通过在任何goroutine中调用os.Exit()
或类似的方法来终止整个进程。
英文:
I think you need to consider the goroutine implications separately to the process implications.
The main()
function is a goroutine (or if you want to be really picky, called from an implicitly created goroutine). Using go
creates other goroutines. Returning from main()
terminates its goroutine but also terminates the process as a whole (and thus all other goroutines). It is also possible to terminate the process as a whole by calling os.Exit()
or similar from any goroutine.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论