Will time.Sleep Suspend a Goroutine?
Time.Sleep は、指定された期間実行を一時停止するために Go プログラムでよく使用されます。ただし、他のプログラミング言語とは異なり、time.Sleep はゴルーチンを実際にはブロックしません。
MPG モデルとゴルーチンのスケジューリング
Go のランタイム スケジューラは、MPG ( M: M's、P: P's、G: ゴルーチン)。各 M (マシン) は P (プロセッサー) のゴルーチンを同時に実行します。ゴルーチンがブロッキング状態になると、その P は M から分離され、アイドル状態の M を見つけるか、使用可能な M が見つからない場合は新しい M を作成します。
Does time.Sleep Block Goroutines?
はい、time.Sleep はゴルーチンがブロッキング状態にあることを示します。これは、ゴルーチンが一時的に利用できないため、次のステートメントをすぐに実行できないことを意味します。
なぜ time.Sleep はより多くのスレッドを作成しないのですか?
ブロックの性質にもかかわらずtime.Sleep の場合、ランタイム スケジューラは追加のスレッドを作成しない場合があります。これは、スケジューラがパフォーマンスとリソースの使用率を最適化することを目的としているためです。したがって、非スリープ ゴルーチンを処理するのに十分なスレッドが存在する場合、time.Sleeping goroutines.
ルールの例外
に対して新しいスレッドは割り当てられません。ただし、例外的な状況下では、大量の時間がある場合、スリープ状態のゴルーチンがある場合、スケジューラは維持するために追加のスレッドを作成することがあります。 Responseness.
time.Sleep とリアル IO の違い
指定された例では、リアル IO を使用すると、time を使用した場合に比べてスレッドの数が多くなります。寝る。これは、IO 操作にはオペレーティング システムおよび外部デバイスとの対話が含まれるため、追加のブロック ポイントが発生し、専用のスレッドが必要になる可能性があります。
結論
while time.Sleep は次のことを示します。ブロッキングゴルーチンですが、必ずしも新しいスレッドの作成につながるわけではありません。ランタイム スケジューラは、利用可能なリソースとアクティブなゴルーチンの数に基づいてスレッド割り当てを最適化します。開発者は、過度のスレッド使用という病的なケースをシミュレートするようにプログラムが意図的に設計されていない限り、スレッドの作成について過度に心配する必要はありません。
以上がtime.Sleep() は本当に Go のゴルーチンをブロックしますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。