時間ベースのスケジューリング
定期的な処理を実行します
「時間ベースのスケジューリング」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。
スケジュールに沿った処理の実行
多くのシステムでは、定期的な処理が必要です。たとえば、毎晩の一時ファイルの削除、毎朝のダイジェストメールの送信、1分ごとのAPIポーリングなどです。このレッスンでは、標準ライブラリを使ったGoの時間ベースのスケジューリングを紹介します。
timeパッケージ
Goのtimeパッケージが基盤になります。主なツールは次のとおりです。
time.Sleepはgoroutineを一時停止しますtime.Afterは1回だけ発火するチャネルを返しますtime.Tickerは繰り返し発火しますtime.Timerは遅延後に1回だけ発火します
単純なループ
最も単純なスケジューラは、処理を実行し、スリープし、繰り返すものです。
package main
import (
"fmt"
"time"
)
func main() {
for i := 0; i < 3; i++ {
fmt.Println("tick", i)
time.Sleep(10 * time.Millisecond)
}
}Sleepでずれが生じる理由
スリープループではずれが生じます。処理に200ミリ秒かかり、1秒スリープする場合、実際の間隔は1.2秒になり、そのずれが蓄積します。正確な間隔にはTickerを使います。これは後のレッスンで扱います。
1回限りの遅延に使うtime.After
time.After(d)は、期間dが経過した後に1回だけ値を受信するチャネルを返します。selectでタイムアウトを実装する際に便利です。
select {
case <-time.After(2 * time.Second):
fmt.Println("2s elapsed")
}time.Timer
Timerは1回だけ発火し、停止またはリセットできます。キャンセルできないtime.Afterとは異なります。
t := time.NewTimer(5 * time.Second)
defer t.Stop()
<-t.C
fmt.Println("fired")特定の時刻にスケジュールする
たとえば午前3時に実行するには、その時刻までの期間を計算して、その期間だけsleepまたはtimerで待機し、翌日の実行を再スケジュールします。
now := time.Now()
next := time.Date(now.Year(), now.Month(), now.Day(), 3, 0, 0, 0, now.Location())
if next.Before(now) {
next = next.Add(24 * time.Hour)
}
fmt.Println("sleep for", time.Until(next))Durationは型付きです
time.Durationはナノ秒単位のint64で、time.Second、time.Minute、time.Hourといった便利な定数があります。これらを乗算すると、読みやすい間隔を表せます。
every := 30 * time.Minute
fmt.Println(every)単調時計と実時間時計
Goのtime.Nowには、経過時間の計測に使う単調時計の値が含まれており、時計の調整の影響を受けません。期間の計算には実時間の減算ではなく、time.Sinceを使ってください。
start := time.Now()
// ... work ...
fmt.Println("took", time.Since(start))ライブラリを使うタイミング
「平日の毎朝9時15分」のような複雑なスケジュールでは、時刻の計算を自作するとエラーが起きやすくなります。次に扱うrobfig/cronライブラリを使えば、cron式を解析してくれます。
実行例:次回実行時刻の計算
この自己完結型プログラムは、timeパッケージだけを使って、次の分の境界までの時間を計算します。
package main
import (
"fmt"
"time"
)
func main() {
now := time.Date(2026, 1, 1, 10, 30, 45, 0, time.UTC)
nextMinute := now.Truncate(time.Minute).Add(time.Minute)
fmt.Println("now:", now.Format("15:04:05"))
fmt.Println("next run:", nextMinute.Format("15:04:05"))
fmt.Println("wait:", nextMinute.Sub(now))
}理解度チェック
時間ベースのスケジューリングについて理解度を確認しましょう。
まとめ
時間ベースのスケジューリングの基本を学びました。
timeパッケージはSleep、After、Timer、Tickerを提供します- Sleepループではずれが生じますが、Tickerはスケジュールを維持します
time.Untilを使って、目標時刻までの期間を計算します- 経過時間の計測には
time.Sinceと単調時計を使います
よくある質問
「時間ベースのスケジューリング」レッスンは無料ですか?
はい。「時間ベースのスケジューリング」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。
「時間ベースのスケジューリング」で何を学びますか?
定期的な処理を実行します ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Go Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「時間ベースのスケジューリング」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このGo Academyレッスンでコードを書いて実行できますか?
はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 時間ベースのスケジューリング
- robfig/cronライブラリ
- 間隔処理用のTicker
- ジョブのグレースフルシャットダウン