Go 言語では、ゴルーチンを使用して同時実行性を実現できますが、実際の実行では、Go プログラムは依然として単一です。 -threaded 進行中です。この一見矛盾した現象は、主に Go 言語の組み込みスケジューラーによるものです。この記事では、Go 言語のシングルスレッド機能を詳細に分析し、具体的なコード例を通じてその動作原理を説明します。
Go 言語では、キーワード go
を使用して goroutine を作成でき、これにより並行プログラミングを簡単に実行できます。ただし、ゴルーチンでは複数のタスクを同時に実行できますが、これらのタスクは実際には単一のスレッドで実行されることに注意してください。 Go 言語の設計コンセプトは、プログラミングを簡潔かつ明確にし、基礎となるスレッド管理を隠蔽することで、開発者がスレッド管理と同期にあまり注意を払う必要がなく、ビジネス ロジックの実装に集中できるようにすることです。
Go 言語スケジューラは、ゴルーチンのスケジューリングと実行を制御する役割を果たし、複数のゴルーチンを使用可能な論理プロセッサに割り当てて実行します。 1 つの論理プロセッサは 1 つのオペレーティング システム スレッドに対応します。つまり、Go プログラムは内部的には引き続き単一のスレッドで実行されます。スケジューラは、異なる論理プロセッサ間でゴルーチンを切り替えて、同時実行の効果を実現します。
次に、特定のコード例を使用して、Go 言語のシングル スレッドの特性を分析します。メインのゴルーチンと 2 つのサブゴルーチンを含む単純なプログラムがあり、各ゴルーチンがテキストを出力するとします。
package main 輸入 ( 「fmt」 "時間" ) func printText(テキスト文字列) { for i := 0; i < 5; i { fmt.Println(テキスト) time.Sleep(100 * time.ミリ秒) } } 関数 main() { go printText("ゴルーチン 1") go printText("ゴルーチン 2") printText("メインゴルーチン") time.Sleep(2 * time.Second) }
上記のコードでは、テキストを印刷するための printText
関数を作成し、別のテキストを印刷するために main
関数内で 3 つのゴルーチンを開始しました。 time.Sleep
を呼び出して、プログラムが途中で終了しないようにします。
このコードを実行すると、出力は次のようになります:
Main goroutine ゴルーチン 1 ゴルーチン 1 ゴルーチン 2 ゴルーチン 1 ゴルーチン 2 ゴルーチン 1 ゴルーチン 2 ゴルーチン 1 ゴルーチン 2 Goroutine 1
出力からわかるように、複数の goroutine を開始しましたが、それらは引き続き単一スレッドで交互に実行され、main
関数の printText## が実行されます。 #この呼び出しは、スケジューラのスケジューリング プロセスにも参加します。
以上がGo言語のシングルスレッド特性を分析するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。