django_extentions の job 起動順
Django で cron から呼び出すバッチを作成するのに、django_extentions の job を使用することができますが、日次バッチを起動する順番はどうやって指定するのかわからなかったので調べました。
まず django_extentions の job についてですが、「Jobs Scheduling」で説明されている通り、Django のアプリケーションディレクトリ直下に jobs ディレクトリを作成し、daily や weekly みたいなサブディレクトリを作って、そこに BaseJob クラスの派生クラスである DailyJob とか WeeklyJob クラスを継承したクラスを作成し、crontab に以下のように記載すれば起動してくれます。
@daily /path/to/my/project/manage.py runjobs daily
@weekly /path/to/my/project/manage.py runjobs weekly
ここで、例えば jobs/daily/ 下に複数の job があった場合、どういう順番になるのか疑問になったのですが、ドキュメントには記載はありませんでした。
普通に考えればファイル名の辞書順だと思うのですが、せっかくだからソースを調べてみました。
ジョブ関係は jobs.py にありました。
モジュールのリストを作成するコードは以下のようになっていました。
def find_jobs(jobs_dir):
try:
return sorted([f[:-3] for f in os.listdir(jobs_dir) if not f.startswith('_') and f.endswith(".py")])
except OSError:
return []
リスト内包表記は jobs/dairy/ などの jobs_dir のファイルのうち、「_」で始まっておらず、サフィックスが「.py」のファイルの「.py」3文字を除いた部分をリスト化しています。
これを sorted() で辞書順にソートしています。
ということで、ジョブファイルの実行順序は、予想通り辞書順でした。
実際に運用する場合のジョブファイルの命名規則はこんなふうになりますかね。
- 3桁の0パディングした数字とアンダーバーで開始(例: 010_)
- そのあとは機能がわかる英数字で、英字は小文字、単語間をアンダーバーでつなぐ(スネークケース)(例: 010_get_daily_news)
- サフィックスは「.py」(例: 010_get_daily_news.py)
- 一時的に起動しないようにする場合は先頭をアンダーバーに変更(例: _010_get_daily_news.py)
- 3桁の数字は010から開始し、2-3桁目をインクリメント(例: 010_xxx の次は 020_yyy)
- あとで途中で追加したい場合は1桁目を使用する (例: 015_zzz)
- 1桁目の数値もあとで前後に追加可能なように、5、2または7、…のような順で使用する