0Pricing
Go Academy · レッスン

間隔処理用のTicker

一定間隔で繰り返します

「間隔処理用のTicker」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。

一定間隔での繰り返し

単純にN秒ごとに何かを実行したい場合は、Tickerが適しています。スリープを使ったループとは異なり、一定の間隔で動作するため、処理時間によるずれが生じません。

Tickerの作成

time.NewTicker(d)は、dごとに現在時刻をチャネルCへ送信するTickerを返します。

ticker := time.NewTicker(time.Second)
defer ticker.Stop()

Tickerは必ず停止する

Tickerは内部タイマーを動作させ続けます。Stop()を一度も呼び出さないと、リソースがリークします。作成した直後にdefer ticker.Stop()を使用してください。

チャネルをrangeで反復処理する

Tickerのチャネルをrangeで反復処理すると、ティックごとに反応できます。

for t := range ticker.C {
    fmt.Println("tick at", t)
}

selectで停止する

Tickerを完了チャネルと組み合わせると、ループを適切に終了できます。

for {
    select {
    case <-ticker.C:
        doWork()
    case <-done:
        return
    }
}

TickerとTimerの比較

主な違い:

  • Timerは遅延の後に1回だけ動作します
  • Tickerは一定間隔で繰り返し動作します

1回限りのタイムアウトにはTimerを、定期的な処理にはTickerを使用してください。

time.Tickの手軽さ

time.Tick(d)はチャネルだけを返します。便利ですが停止できないため、長時間動作するプログラムで使うとリソースがリークします。短いスクリプト以外ではNewTickerを使用してください。

for range time.Tick(time.Second) {
    // simple, but cannot Stop -> avoid in servers
}

時間のかかる処理への対処

処理に間隔よりも長い時間がかかる場合、ティックはキューに追加されません。Tickerはティックをまとめて発生させるのではなく、破棄します。そのため処理の滞留は発生しませんが、負荷が高いと一部のティックがスキップされることがあります。

間隔の調整

間隔を変更するには、新しいTickerを作成します。Go 1.15以降では、ticker.Reset(d)を使って再割り当てを行わずに周期を変更することもできます。

ticker.Reset(500 * time.Millisecond)

コンテキストによるキャンセル

実際のサービスでは、context.Contextを使ってTickerのループを制御し、シャットダウンの通知を受けたら適切に停止できるようにしてください。

case <-ctx.Done():
    return ctx.Err()

実行可能: 一定間隔のTicker

この自己完結型のプログラムは、一定間隔で3回ティックした後、カウンターを使って適切に停止します。

package main

import (
    "fmt"
    "time"
)

func main() {
    ticker := time.NewTicker(10 * time.Millisecond)
    defer ticker.Stop()
    count := 0
    for range ticker.C {
        count++
        fmt.Println("tick", count)
        if count == 3 {
            break
        }
    }
    fmt.Println("done")
}

理解度チェック

Tickerについての理解度を確認しましょう。

まとめ

一定間隔の処理に使うTickerについて学びました:

  • time.NewTicker(d)は、Cチャネルでdごとに動作します
  • リソースのリークを避けるため、必ずdefer ticker.Stop()を使用します
  • Tickerは処理が遅い場合、ティックをまとめて発生させずに破棄します
  • Resetで間隔を変更し、contextまたは完了チャネルで終了します

よくある質問

「間隔処理用のTicker」レッスンは無料ですか?

はい。「間隔処理用のTicker」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。

「間隔処理用のTicker」で何を学びますか?

一定間隔で繰り返します ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Go Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「間隔処理用のTicker」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このGo Academyレッスンでコードを書いて実行できますか?

はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 時間ベースのスケジューリング
  2. robfig/cronライブラリ
  3. 間隔処理用のTicker
  4. ジョブのグレースフルシャットダウン
← Go Academyに戻る