2016-12-15 50 views
1

我正在閱讀Go併發模式片。我有點困惑的聲明之間的表面上的矛盾上slide #16主要只是一個普通的門廳嗎?

當主的回報,程序退出,並採取枯燥功能打倒它。

slide #19另一個(組合與example on slide #20):

在Go的信道提供了兩個夠程之間的連接,允許它們進行通信。

如果main只是一個夠程,它是怎樣導致任何其他(生成)的goroutine停止,換句話說:在何種意義上是夠程命名爲main特別? *


*我搜索了它,但沒有發現任何明顯的啓發爲止;有希望的標題Difference between the main goroutine and spawned goroutines of a Go program的SO問題要求完全不同的問題。

編輯:改變了標題,把重點放在主要和「正常」夠程之間的差異

編輯(在Go運行時函數Goexit絆倒後):簡化問題,甚至可以說更集中在主要細節

+3

你是什麼意思,「它怎麼能控制另一個goroutine」,?似乎沒有任何關於其他事情控制權的goroutine的提及。請注意,當程序從main()返回時,整個進程將死亡/退出。 main()幾乎就是「僅僅」一個gouroutine。但它很特別,因爲當然這是整個程序執行開始的地方(除了正在運行的任何init()函數),並且當main()結束時,進程就會死亡。 – nos

+0

@nos我試圖澄清這個問題,如果它簡直是糟糕的英語,請幫助我的非母語。 – Wolf

+0

@nos *'......幾乎「只是」一個美好的回憶。但是,這是特別的,因爲...... *正是我所要求的(你能否更詳細地解釋這一點?)。幻燈片中的第一個例子顯示了主要和另一個goroutine之間的通道。我對更多細節感興趣,因爲我將它與Windows中的線程進行了比較(其中每個線程相當於我可以保持進程運行,但每個線程都可以退出進程)。 (我已經知道:goroutines不是線程,但通過比較,我希望更好地理解這個概念) – Wolf

回答

3

我認爲你需要分別考慮goroutine影響的過程影響。

main()函數是一個goroutine(或者如果你想要真正挑剔,從隱式創建的goroutine調用)。使用go創建其他goroutines。從main()返回終止其goroutine,但也終止整個過程(並因此所有其他goutoutines)。也可以通過調用os.Exit()或任何goroutine中的類似程序來終止整個過程。

+1

*'也可以通過調用os.Exit()或類似的任何goroutine來終止整個過程。 '* - 感謝提到這個細節,這將是我的下一個問題(不要恐慌,不要在SO上)) – Wolf

+0

值得注意的是,也可以終止main()函數goroutine而不終止程序(假設有其他goroutine活動),通過使用['runtime.Goexit()'](https://golang.org/pkg/runtime/#Goexit)。 – Kaedys

+0

@ Kaedys *'runtime.Goexit()'* < - 我發現不推薦這樣做,因爲在最後一次產生的協程返回後沒有乾淨的進程退出。 (「如果所有其他程序都退出,程序崩潰了」,請參閱您提供的參考) – Wolf

相關問題