Go の同時実行性とチャネルの混乱
問題
ユーザーは Go の同時実行性を理解しようとしています
<code class="go">package main import "fmt" func display(msg string, c chan bool) { fmt.Println("display first message:", msg) c <- true } func sum(c chan bool) { sum := 0 for i := 0; i < 10000000000; i++ { sum++ } fmt.Println(sum) c <- true } func main() { c := make(chan bool) go display("hello", c) go sum(c) <-c }</code>
メイン関数はチャネルからデータを受信したら終了する必要があるため、期待される出力は「最初のメッセージの表示: hello」のみです。ただし、実際の出力には 100 億個の数値の合計も含まれます。
Answer
コードの主な問題は、スケジューラが 2 つのゴルーチンの間で自由に選択できることです。 (表示と合計) ブロックされていません。プログラマは、表示が最初に終了し、合計が完了する前にチャネルにデータが送信されることを期待していますが、スケジューラの非決定的な性質により、これが起こらない可能性があります。
考えられる 1 つの実行シナリオ:
この問題に対処し、「ディスプレイの最初のメッセージ: hello」メッセージが排他的に出力されるようにするための 1 つの方法は、結果チャネルを使用してディスプレイからメッセージを受信し、プログラムを直ちに終了することです。変更された main 関数は次のようになります:
<code class="go">func main() { result := make(chan string) go display("hello", result) fmt.Println(<-result) }</code>
以上がGo コードが単に「最初のメッセージを表示: hello」ではなく、100 億の数値の合計を出力するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。