ホームページ >バックエンド開発 >Golang >Go でゴルーチンを適切に実行するには、なぜ `time.Sleep()` が重要なのでしょうか?

Go でゴルーチンを適切に実行するには、なぜ `time.Sleep()` が重要なのでしょうか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-06 11:58:13364ブラウズ

Why is `time.Sleep()` Crucial for Proper Goroutine Execution in Go?

時間の重要性。ゴルーチンでのスリープ: 確実な実行

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」だけが 5 回出力されます。

なぜ time.Sleep がゴルーチンの実行に重要なのでしょうか?答えは、Go スケジューラの非プリエンプティブな性質にあります。ゴルーチンは相互にプリエンプトしません。つまり、他のゴルーチンの実行を許可するには、明示的に制御を譲る必要があります。

time.Sleep がない場合、メインのゴルーチン (say("hello")) は制御を放棄しません。 、say("world") ゴルーチンの実行を妨げます。その結果、メインのゴルーチンの出力のみが出力され、2 番目のゴルーチンは main() 関数が返されるときに事実上終了します。

したがって、time.Sleep が降伏点として機能し、say("world ") CPU 時間を取得してコードを実行する goroutine。メインのゴルーチンに遅延を導入することで、time.Sleep はセカンダリのゴルーチンがその操作をインターリーブする機会を作成します。

結論として、特定のゴルーチンのシナリオでは、すべてのゴルーチンに確実に実行するチャンス。これを降伏点として使用すると、プリエンプションの問題が防止され、同時プログラミングが意図したとおりに動作できるようになります。

以上がGo でゴルーチンを適切に実行するには、なぜ `time.Sleep()` が重要なのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。