前回の記事では Django-Celery-Beat: PeriodicTaskを活用した予約作業の実際の例 を通じて IntervalScheduleを利用した予約作業を管理する方法を見てきました。

しかし、実際のプロジェクトでは 繰り返し実行(interval)方式だけでは不足する場合が多いです。

  • 毎日 特定の時間に実行する必要がある作業があるとき
  • 特定の 日付と時間に一度だけ実行される作業が必要なとき

このような場合には CrontabやClocked予約方式を使用することで、さらに精密な予約作業を設定できます。 🚀

📌 Crontabの概念に不慣れですか?

➡️ Linux `crontab`を正しく理解する:開発者が愛する自動スケジューリングのヒント

上の記事を先に読んでおくと、さらに理解が深まります! 😊

Django Celery-Beat task scheduling with Crontab and Clocked

1️⃣ `CrontabSchedule`を活用した特定時刻の予約

CrontabはLinuxで使用される予約作業の方法で、 秒/分/時間/曜日/日付などの特定の時間にのみ実行されるように設定できます。

Django-Celery-Beatでも `CrontabSchedule`を活用して同様の方法で予約作業を設定できます。

📌 例:毎日午前9時30分に実行される予約作業

from django_celery_beat.models import PeriodicTask, CrontabSchedule
import json

# 1️⃣ CrontabScheduleの作成(毎日09:30に実行)
schedule, created = CrontabSchedule.objects.get_or_create(
    minute="30",
    hour="9",
    day_of_week="*",
    day_of_month="*",
    month_of_year="*"
)

# 2️⃣ PeriodicTaskの作成または更新
task, created = PeriodicTask.objects.update_or_create(
    name="daily_report_task",
    defaults={
        "crontab": schedule,  # CrontabScheduleを適用
        "task": "myapp.tasks.generate_daily_report",
        "args": json.dumps([]),
        "enabled": True,
    }
)

✅ 上記の設定により、 毎日午前9時30分に実行されるように予約されます! 🎯

✅ `CrontabSchedule`フィールドの説明

フィールド名 説明
`minute` 実行する分の設定 "0", "30", "*/10"
`hour` 実行する時間の設定 "0", "9", "*/6"
`day_of_week` 実行する曜日の設定 (0=日曜日) "*"(毎日), `"1,3,5"`(月/水/金)
`day_of_month` 実行する日付の設定 "*"(毎日), `"1,15"`(毎月1日、15日)
`month_of_year` 実行する月の設定 "*"(毎月), `"1,6,12"`(1月、6月、12月)

2️⃣ `ClockedSchedule`を活用した特定の時間に一度だけ実行

`ClockedSchedule`は特定の日付と時間に一度だけ実行される予約作業を設定するために利用されます。

📌 例:特定の日付(2025年2月10日15:00)に一度だけ実行される予約作業

from django_celery_beat.models import PeriodicTask, ClockedSchedule
import json
from datetime import datetime

# 1️⃣ ClockedScheduleの作成(2025年2月10日15:00に実行)
scheduled_time = datetime(2025, 2, 10, 15, 0)  # datetimeオブジェクトの使用が必須!
schedule, created = ClockedSchedule.objects.get_or_create(
    clocked_time=scheduled_time
)

# 2️⃣ PeriodicTaskの作成 (one_off=True設定!)
task, created = PeriodicTask.objects.update_or_create(
    name="one_time_task_20250210",
    defaults={
        "clocked": schedule,  # ClockedScheduleを適用
        "task": "myapp.tasks.one_time_email",
        "args": json.dumps([]),
        "enabled": True,
        "one_off": True,  # 実行後自動無効化
    }
)

✅ 上記の設定により、 2025年2月10日15時00分に一度だけ実行された後、 自動的に無効化されます。

  • 📌 ClockedScheduleモデルのインスタンスを生成する際、clocked_timeフィールドは必ずdatetimeオブジェクトで入力する必要があります。
  • 📌 文字列や他のデータタイプを使用するとエラーが発生する可能性があります。

📌 ClockedScheduleとone_offオプションの関係は?

ClockedSchedule一度だけ実行される作業を作成する際one_off=True を設定することで、
この設定がenabledフィールドとどう相互作用するか疑問に思うかもしれません。

📌 この2つのフィールド(clocked_timeone_off)間の関係についてもっと詳しく知りたいですか?

➡️ Celery Beatでのone-offとenabledの関係:正確な理解と使用法

上の記事では、 `one_off=True`が正確にどう機能するのか、 `enabled`との違いについて詳しく説明しているので参考にしてください! 😊

🎯 結論: CrontabClockedを活用すれば、より精密な予約作業が可能!

  • CrontabScheduleを使用することで 繰り返し実行されるが特定の時刻に実行される作業を予約できます!
  • ClockedScheduleを使用することで 特定の時点に一度だけ実行される作業を予約できます!
  • ClockedSchedule生成時のclocked_timeフィールドは必ずdatetimeオブジェクトで入力する必要があります!
  • ClockedScheduleone_off=True設定間の関係は別の記事でさらに詳しく説明しているので、ぜひ確認してください!

より深いCeleryの活用法を知りたい方は、

以下の '類似ポスト' リストや、右上の検索ボックスで `"Celery"` を検索してみてください! 🚀 😊