1. ホーム
  2. go

[解決済み] 繰り返しの作業を間隔をあけて行う方法はありますか?

2022-04-20 20:21:05

質問

Go で反復的なバックグラウンド タスクを実行する方法はありますか? 次のようなものを考えています。 Timer.schedule(task, delay, period) をJavaで作成しました。 ゴルーチンでできることは知っていますし Time.sleep() しかし、私は簡単に停止するものが欲しいです。

これは私が得たものですが、私には醜く見えます。 もっときれいで良い方法はないでしょうか?

func oneWay() {
    var f func()
    var t *time.Timer

    f = func () {
        fmt.Println("doing stuff")
        t = time.AfterFunc(time.Duration(5) * time.Second, f)
    }

    t = time.AfterFunc(time.Duration(5) * time.Second, f)

    defer t.Stop()

    //simulate doing stuff
    time.Sleep(time.Minute)
}

解決方法は?

機能 time.NewTicker は、定期的にメッセージを送信するチャネルを作成し、それを停止する方法を提供します。以下のような感じで使ってみてください(未検証)。

ticker := time.NewTicker(5 * time.Second)
quit := make(chan struct{})
go func() {
    for {
       select {
        case <- ticker.C:
            // do stuff
        case <- quit:
            ticker.Stop()
            return
        }
    }
 }()

を閉じるとワーカーを停止することができます。 quit チャネルを使用します。 close(quit) .