Golang のバッファなしチャネルは、送信者から受信者へのメッセージ配信の順序が予測できないという、同時プログラミングの興味深い側面を導入します。特定のコード例とその分析を使用して、その理由を探ってみましょう。
func main() { messages := make(chan string) go func() { messages <- "hello" }() go func() { messages <- "ping" }() msg := <-messages msg2 := <-messages fmt.Println(msg) // "ping" fmt.Println(msg2) // "hello" }
両方の送信側ゴルーチンが同時に実行されているため、どのメッセージが最初にチャネルに送信されるか。この特定のコードでは、最初に「ping」が出力され、次に「hello」が出力されることが一貫して観察されます。これは、Golang のゴルーチン スケジューリングの非決定性の性質によるものです。
Golang のゴルーチンはランタイムによってスケジュールされます。つまり、実行順序は予測できません。これは、コアの可用性、スレッド スケジューリング アルゴリズム、およびコードの性質が実行順序に影響を与える可能性がある同時プログラミングの重要な側面です。
これを説明すると、 -決定性をさらに高めるには、送信側ゴルーチンからのメッセージを出力するようにコードを変更することを検討してください。
func main() { messages := make(chan string) // Print before writing to the channel go func() { fmt.Println("Sending hello"); messages <- "hello" }() go func() { fmt.Println("Sending ping"); messages <- "ping" }() // Receive messages and print msg := <-messages msg2 := <-messages fmt.Println(msg) fmt.Println(msg2) }
Inこの変更されたコードでは、次の出力順序が確認できます。
Sending hello Sending ping ping hello
これは、「ping」を送信したゴルーチンよりも前に、「hello」を送信したゴルーチンが実行され、チャネルに書き込むようにスケジュールされていることを示しています。ただし、「ping」は受信され、メイン ルーチンで最初に出力されます。
Golang のバッファリングされていないチャネルは、メッセージ配信の順序。メッセージ受信の順序は、ランタイムにおけるゴルーチンのスケジューリングの非決定的な性質に依存します。潜在的な混乱を避けるためには、この非決定論を理解し、必要に応じて適切な措置を講じることが不可欠です。
以上がGolang のバッファリングされていないチャネルでは出力順序が予測できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。