2016-12-15 3 views
1

私は現在、のスライスを読んでいます。同時実行パターンになります。私はslide #16上の文の間に外見上の矛盾について少し混乱しています:メインはちょうど正常なゴルーチンですか?

すると、メイン戻り、プログラムが終了し、それを退屈な機能をダウンかかります。

及び(example on slide #20と組み合わせて)slide #19上のもう一つ:

進み、チャネルは、それらが通信することを可能にする、2つのゴルーチン間の接続を提供します。

mainはちょうどゴルーチン、どのようにそれは言い換えれば、停止する任意の他の(生まれた)ゴルーチンを引き起こす可能性がありますの場合:どのような意味でゴルーチンがmain特別に命名されますか? **


私はそれを探し、これまでのところ明らかに啓発何も見つかりませんでした。有望なタイトルDifference between the main goroutine and spawned goroutines of a Go programのSOの質問は全く別の問題を求めています。

編集:

編集(ゴーランタイム機能Goexit時にひっかかった後)、「ノーマル」のメインとゴルーチンの違いに焦点を当て、タイトルを変更:簡素化問題、さらに焦点を合わせますメインの詳細について

+3

「他のゴルーチンをどうやってコントロールできますか」とはどういう意味ですか?他に何かを支配するゴルーチンの言及はないようです。プログラムがmain()から戻ると、プロセス全体が終了/終了することに注意してください。 main()はgouroutineのほぼ「ちょうど」です。しかし、プログラム全体の実行が開始されるのは当然です(init()関数の実行に加えて)。main()が終了すると、プロセスは終了します。 – nos

+0

@nos私は質問でこれを明確にしようとしました、それが単に英語が悪ければ、非母語話者を助けてください。 – Wolf

+0

@nos * '...ほとんど"ちょうど "gouroutine。しかし、それは特別なものです。 '*私が求めているのは正確です(もっと詳しく説明できますか?)。スライドの最初の例は、メインと別のゴルーチンとの間のチャネル通信を示しています。私はこれをWindowsのスレッドと比較するので、もっと詳細に興味がありました(そこには、それぞれのスレッドが同等の意味でプロセスを実行し続けることができますが、それぞれプロセスを終了できます)。 (私はすでに知っています:goroutinesはスレッドではありませんが、比較するとコンセプトをよりよく理解することを望みます) – Wolf

答えて

3

私はあなたがプロセスの意味とは別にゴルーチンの影響を考慮する必要があると思います。

main()関数は、ゴルーチンです(暗黙的に作成されたゴルーチンから呼び出されるのが本当に不快な場合)。 goを使用すると、他のゴルーチンが作成されます。 main()から戻ってくると、ゴルーチンが終了するだけでなく、プロセス全体が終了します(したがって、他のすべてのゴルーチンも終了します)。 os.Exit()などを任意のゴルーチンから呼び出すことで、プロセス全体を終了することもできます。

+1

* 'os.Exit()などのgoroutineを呼び出すことでプロセス全体を終了することもできます。 '* - このディテールについて言及してくれてありがとう、これは私の次の質問だったでしょう。(SOではない、パニックではありません)) – Wolf

+0

' main() '関数のgoroutineを終了させることなく、 ( '' runtime.Goexit() '](https://golang.org/pkg/runtime/#Goexit)を使用して、他のgoroutinesがアクティブであると仮定して、プログラムを実行します。 – Kaedys

+0

@Kaedys * 'runtime.Goexit()' * < - これは、最後に生成されたコルーチンが返った後にクリーンなプロセスの終了がないので、お勧めできませんでした。 ( "他のすべてのゴルーチンが終了した場合、プログラムがクラッシュする"、参照してください) – Wolf

関連する問題