タイマーと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フィードバックを取得できます。ローカル設定は不要です。