ゴルーチン実行における time.sleep の役割を理解する
Go では、ゴルーチンは軽量の同時実行スレッドです。ゴルーチンとチャネル通信を組み合わせることで堅牢な同時実行プリミティブが提供されますが、特定のシナリオでは、飢餓を防ぎ、実行の公平性を確保するために、time.sleep などのブロック関数の使用が必要になります。
Go チュートリアルの次のコード スニペットを検討してください。
package main import ( "fmt" "time" ) func say(s string) { for i := 0; i < 5; i++ { time.Sleep(100 * time.Millisecond) fmt.Println(s) } } func main() { go say("world") say("hello") }
このコードを実行すると、「hello」と「world」が交互に画面に 5 回表示されます。ただし、time.Sleep がコメントアウトされている場合は、「hello」のみが出力されます。この動作は、時間の重要性を強調しています。ゴルーチン実行中のスリープ。
Go ランタイム スケジューラーはプリエンプティブではありません。これは、他のゴルーチンが実行できるようにするには、ゴルーチンが自発的に制御を放棄する必要があることを意味します。制御を解放する 1 つの方法は、time.Sleep を使用することです。
上記のコード スニペットでは、time.Sleep が削除された場合、「hello」ゴルーチンは「world」ゴルーチンに機会を与えずに 5 回の反復で実行されます。実行します。その結果、「hello」ゴルーチンが終了すると、それを存続させている他のゴルーチンが存在しないため、プログラムは終了します。
したがって、time.Sleep はゴルーチンのスケジューリングの公平性を確保する上で重要な役割を果たします。特定のゴルーチンの実行に短い遅延を導入することで、他のゴルーチンの実行が可能になり、他のゴルーチンの飢餓または完全な飢餓を防ぎます。
以上が`time.Sleep()` は Go でゴルーチンの枯渇をどのように防ぐのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。