ホームページ  >  記事  >  バックエンド開発  >  Go で Goroutine を効果的に終了するにはどうすればよいでしょうか?

Go で Goroutine を効果的に終了するにはどうすればよいでしょうか?

DDD
DDDオリジナル
2024-10-30 13:15:03664ブラウズ

How do you effectively terminate a Goroutine in Go?

Go での Goroutine の強制終了

Go ルーチンを操作する場合、効果的に終了する方法を知ることが不可欠になります。次の設定を考えてみましょう:

<code class="go">func startsMain() {
    go main()
}

func stopMain() {
    // TODO: Kill main
}

func main() {
    // Infinite loop
}</code>

この設定では、main という名前のゴルーチンに無限ループが作成されます。ループを終了するには、stopMain から goroutine を制御する方法が必要です。

解決策: Channel と select

を使用する goroutine を強制終了する効果的な方法の 1 つは、channel と select ステートメントを使用することです。

<code class="go">var quit chan struct{}

func startLoop() {
    quit := make(chan struct{})
    go loop(quit)
}

func stopLoop() {
    close(quit)
}

func loop(quit chan struct{}) {
    for {
        select {
        case <-quit:
            return
        default:
            // Do stuff
        }
    }
}</code>

この例では、quit という名前のサイズ 0 のチャネル (chan struct{}) を使用して、ゴルーチンに停止の信号を送ります。ループ関数は、select ステートメントを使用して終了チャネルを繰り返しチェックします。 quit が値 (停止リクエストを示す) を受け取ると、ループは終了します。

その他の同時実行パターン

Go は、ゴルーチンを処理するための追加の同時実行パターンを提供します。これらのパターンの詳細については、Go ブログをご覧ください。

タイマーの使用

CPU の枯渇を避けながら関数を定期的に実行するには、ティッカーを使用できます。

<code class="go">import "time"

// [...]

func loop() {
    ticker := time.NewTicker(2 * time.Second)
    defer ticker.Stop()
    for {
        select {
        case <-quit:
            return
        case <-ticker.C:
            // Do stuff
        }
    }
}</code>

この場合、quit が値を受け取るかティッカーが起動するまでブロックを選択し、指定された間隔で関数を実行できるようにします。

以上がGo で Goroutine を効果的に終了するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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