ホームページ > バックエンド開発 > Golang > `time.Sleep()` は Go でゴルーチンの枯渇をどのように防ぐのでしょうか?

`time.Sleep()` は Go でゴルーチンの枯渇をどのように防ぐのでしょうか?

Susan Sarandon
リリース: 2024-12-03 09:42:10
オリジナル
319 人が閲覧しました

How Does `time.Sleep()` Prevent Goroutine Starvation in Go?

ゴルーチン実行における 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート