はじめに
Go の time パッケージは、さまざまな時間関連の関数を提供します。これには、指定された期間ゴルーチンの実行を一時停止する time.Sleep が含まれます。この質問は、time.Sleep が本当に goroutine をブロックするかどうかを調査し、goroutine が time.Sleep.
を使用しているときの Go スケジューラの動作を調べます。応答、time.Sleep は実際に goroutine をブロックします。ただし、囲碁における「ブロック」の概念は厳密に定義されていないことに注意することが重要です。ここでの「ブロック」とは、現在のステートメントがまだ進行中であるため、次のステートメントの実行をすぐに続行できないことを意味します。
Goroutine のスケジューリング
Goroutine はスケジュールされています。 Go スケジューラによってスレッドに追加されます。スケジューラは「MPG モデル」に従います。P はプロセッサの数、M はオペレーティング システムのスレッドの数、G はゴルーチンの数を表します。ゴルーチンがブロックされると、スケジューラは現在の M からゴルーチンを切り離し、アイドル状態の M を見つけてスケジュールするか、必要に応じて新しい M を作成します。
スレッド数の監視
n の値が増加するとスレッド数が増加するという観察は、スケジューラの動作の結果です。さらに多くのゴルーチンが作成されると、スケジューラはそれらを処理するために追加の M スレッドを作成します。ただし、限られた数の追加スレッドのみが作成されるという事実は、すべてのゴルーチンが個別のスレッドを必要とするわけではないことを判断するスケジューラーの機能によるものです。
実際の IO との比較
実際の IO (ioutil.WriteFile) を使用した例では、ゴルーチンが IO などの実際のシステム リソースを伴うブロック操作を実行しているときを示しています。作成されるスレッドの数は大幅に増加します。これは、スケジューラがこれらのブロック操作を処理するためにスレッドの作成を避けることができないためです。
結論
time.Sleep はゴルーチンをブロックしますが、それを行うのはスケジューラの責任です。スレッドへのゴルーチンのマッピングを効率的に管理します。開発者はスケジューラの動作の詳細について心配する必要はなく、Go ランタイムを利用してこれらの問題を効果的に処理できます。
以上がtime.Sleep は Go の Goroutine をブロックしますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。