0Pricing
Go Academy · レッスン

時間ベースのスケジューリング

定期的な処理を実行します

「時間ベースのスケジューリング」は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フィードバックを取得できます。ローカル設定は不要です。

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

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