0Pricing
Go Academy · レッスン

タイマーとTicker

処理をスケジュールして繰り返します

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

Sleepによる一時停止

最も簡単なスケジューリング手段はtime.Sleep(d)です。現在のゴルーチンを指定した期間だけ一時停止します。

package main

import (
    "fmt"
    "time"
)

func main() {
    fmt.Println("start")
    time.Sleep(10 * time.Millisecond)
    fmt.Println("done")
}

Timerとは

time.Timerは遅延後に1回だけ発火します。期限が来ると、現在時刻を自身のCチャネルに送信します。

package main

import (
    "fmt"
    "time"
)

func main() {
    t := time.NewTimer(10 * time.Millisecond)
    <-t.C
    fmt.Println("timer fired")
}

time.Afterによる簡略化

time.After(d)は、遅延後に1つの値を届けるチャネルを返します。変数を使わずにワンショットタイマーを利用できる便利な方法です。

package main

import (
    "fmt"
    "time"
)

func main() {
    <-time.After(10 * time.Millisecond)
    fmt.Println("elapsed")
}

Timerの停止

timer.Stop()は、発火する前にタイマーをキャンセルします。間に合ってタイマーを停止できた場合はtrueを返します。

package main

import (
    "fmt"
    "time"
)

func main() {
    t := time.NewTimer(time.Hour)
    stopped := t.Stop()
    fmt.Println("stopped:", stopped)
}

Tickerとは

time.Tickerは固定間隔で繰り返し発火し、そのたびに自身のCチャネルへ送信します。

ポーリングやアニメーションフレームなど、定期的な処理に使用します。

package main

import (
    "fmt"
    "time"
)

func main() {
    ticker := time.NewTicker(5 * time.Millisecond)
    <-ticker.C
    fmt.Println("tick")
    ticker.Stop()
}

ティックのカウント

ティッカーのチャネルをループして各間隔で処理し、十分な回数のティックを受け取ったら停止します。

package main

import (
    "fmt"
    "time"
)

func main() {
    ticker := time.NewTicker(5 * time.Millisecond)
    for i := 1; i <= 3; i++ {
        <-ticker.C
        fmt.Println("tick", i)
    }
    ticker.Stop()
}

Tickerは必ず停止する

タイマーとは異なり、TickerはStop()を呼び出すまで動作し続けます。停止し忘れるとリソースリークにつながります。

package main

import (
    "fmt"
    "time"
)

func main() {
    ticker := time.NewTicker(5 * time.Millisecond)
    defer ticker.Stop()
    <-ticker.C
    fmt.Println("one tick, will stop on return")
}

time.Tickによる簡便な利用

time.Tick(d)はティッカーのチャネルを直接返します。簡単に使えますが停止できないため、プログラムの実行期間全体で使用する場合に限ってください。

package main

import (
    "fmt"
    "time"
)

func main() {
    c := time.Tick(5 * time.Millisecond)
    <-c
    fmt.Println("ticked")
}

selectによるタイムアウト

作業用のチャネルとtime.Afterをselectで組み合わせると、タイムアウトを実装できます。

package main

import (
    "fmt"
    "time"
)

func main() {
    done := make(chan bool)
    go func() { done <- true }()
    select {
    case <-done:
        fmt.Println("work finished")
    case <-time.After(time.Second):
        fmt.Println("timed out")
    }
}

AfterFuncでコールバックを実行する

time.AfterFunc(d, f)は、遅延後に関数fを専用のゴルーチンで実行します。チャネルを読み取る必要はありません。

package main

import (
    "fmt"
    "time"
)

func main() {
    done := make(chan bool)
    time.AfterFunc(10*time.Millisecond, func() {
        fmt.Println("callback ran")
        done <- true
    })
    <-done
}

TimerとTickerの違い

繰り返しの有無に応じて選択します。

  • Timer:遅延後に1回発火します。
  • Ticker:一定間隔で何度も発火します。
  • 処理が終わったら、リソースを解放するために両方とも停止します。
package main

import (
    "fmt"
    "time"
)

func main() {
    <-time.After(5 * time.Millisecond)
    fmt.Println("one-shot complete")
}

クイックチェック

固定間隔で繰り返し発火するのはどの型ですか?

まとめ:TimerとTicker

処理をスケジュールする方法を学びました。

  • Sleepは一時停止し、Timerとtime.Afterは1回発火します。
  • Tickerとtime.Tickは繰り返し発火します。
  • Stop()で後片付けを行い、selectと組み合わせてタイムアウトを実装します。
package main

import (
    "fmt"
    "time"
)

func main() {
    ticker := time.NewTicker(5 * time.Millisecond)
    defer ticker.Stop()
    for i := 0; i < 2; i++ {
        <-ticker.C
        fmt.Println("beat")
    }
}

よくある質問

「タイマーと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. 書式設定と解析
  3. タイマーとTicker
  4. タイムゾーン
← Go Academyに戻る