ホームページ > バックエンド開発 > Golang > Golang でティッカー チャネルを使用するときに Goroutine を適切に終了するにはどうすればよいですか?

Golang でティッカー チャネルを使用するときに Goroutine を適切に終了するにはどうすればよいですか?

Patricia Arquette
リリース: 2024-11-07 19:16:02
オリジナル
509 人が閲覧しました

How to Properly Terminate a Goroutine When Using a Ticker Channel in Golang?

Golang でのティッカー チャネルの動作

ティッカー チャネルを反復処理して Stop() を呼び出すと、チャネルは一時停止しますが、閉じません。これにより、ゴルーチンが無期限にアクティブなままになる可能性があります。

ケース例:

次のコード スニペットを考えてみましょう:

package main

import (
    "fmt"
    "time"
)

func main() {
    ticker := time.NewTicker(1 * time.Second)
    go func() {
        for _ = range ticker.C {
            fmt.Println("tick")
        }
    }()
    time.Sleep(3 * time.Second)
    fmt.Println("stopping ticker")
    ticker.Stop()
    time.Sleep(3 * time.Second)
}
ログイン後にコピー

出力:

2013/07/22 14:26:53 tick
2013/07/22 14:26:54 tick
2013/07/22 14:26:55 tick
2013/07/22 14:26:55 stopping ticker
ログイン後にコピー

できる限りティッカーを停止したにもかかわらず、チャネルが閉じられていないため、ゴルーチンは無限に繰り返し続けます。

解決策:

ゴルーチンを確実に終了させる 1 つの方法は、次の方法を使用することです。次のような 2 番目のチャネル:

package main

import (
    "fmt"
    "log"
    "time"
)

// Run the function every tick
// Return false from the func to stop the ticker
func Every(duration time.Duration, work func(time.Time) bool) chan bool {
    ticker := time.NewTicker(duration)
    stop := make(chan bool, 1)

    go func() {
        defer log.Println("ticker stopped")
        for {
            select {
            case time := <-ticker.C:
                if !work(time) {
                    stop <- true
                }
            case <-stop:
                return
            }
        }
    }()

    return stop
}

func main() {
    stop := Every(1*time.Second, func(time.Time) bool {
        fmt.Println("tick")
        return true
    })

    time.Sleep(3 * time.Second)
    fmt.Println("stopping ticker")
    stop <- true
    time.Sleep(3 * time.Second)
}
ログイン後にコピー

この中でコード:

  • Every 関数は、ティッカー チャネルとストップ チャネルの 2 つのチャネルを作成します。
  • ゴルーチンは両方のチャネルを反復処理します。
  • 作業関数が返された場合false の場合、停止チャネルが通知され、ゴルーチンが終了します。
  • Stop() が呼び出されると、メッセージが送信されます。停止チャネルに転送し、ゴルーチンを終了します。

以上がGolang でティッカー チャネルを使用するときに Goroutine を適切に終了するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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