APScheduler を使用した Python でのカスタムクロックプロセスによる定期的なジョブ
最終更新日 2024年04月29日(月)
Table of Contents
バックグラウンドジョブをスケジュールする機能は、最新の Web アプリの要件です。これらのジョブはユーザー指向のジョブ (メールの送信など) や、管理ジョブ (バックアップの取得やデータの同期など) のほか、場合によってはアプリ自体のより不可欠な部分であることもあります。
単一サーバーデプロイでは、cron
などのシステムレベルのツールが、この種類のスケジューリングを実現するための明確な選択肢です。ただし、Heroku などのクラウドプラットフォームにデプロイする場合は、マシンにローカルなツールが役に立たない分散環境でアプリケーションのインスタンスが実行されるため、より高いレベルのものが必要です。
Heroku Scheduler アドオンは、10 分、毎時、毎日の間隔 (または、これらの間隔の倍数) で実行する必要がある単純なタスクのための優れたソリューションです。ただし、5 分または 37 分ごとに実行する必要があるタスクや、限定された時刻に実行する必要があるタスクについてはどうでしょうか。これらのより固有の、複雑なユースケースの場合は、独自のスケジューリングプロセスの実行が非常に役立つ場合があります。
APScheduler
Python には、選択できるいくつかのスケジューリングライブラリがあります。 Celery は、定期的なタスクをサポートする、きわめて堅牢な同期タスクキューおよびメッセージシステムです。
この例では、軽量のインプロセスタスクスケジューラーである APScheduler を使用します。これは、クリーンで使いやすいスケジューリング API を提供し、依存関係はなく、どの特定のジョブキューイングシステムにも関連付けられていません。
APScheduler は、Pip を使用して簡単にインストールできます。
$ pip install apscheduler
その後、それを requirements.txt
に必ず追加してください。
APScheduler>=3.10,<4.0
実行スケジュール
次に、スケジュールを定義するためのファイルを作成する必要があります。APScheduler のドキュメントには、このライブラリの柔軟性を示す多くの優れた例が含まれています。
単純な clock.py
ファイルの例を次に示します。
from apscheduler.schedulers.blocking import BlockingScheduler
sched = BlockingScheduler()
@sched.scheduled_job('interval', minutes=3)
def timed_job():
print('This job is run every three minutes.')
@sched.scheduled_job('cron', day_of_week='mon-fri', hour=17)
def scheduled_job():
print('This job is run every weekday at 5pm.')
sched.start()
ここでは、バックグラウンドジョブを 2 つの異なる方法でキューに入れるように APScheduler を設定しました。最初のディレクティブは、クロックプロセスが起動された時刻から開始して 3 分ごとに間隔ジョブをスケジュールします。2 番目は、平日に 1 回午後 5 時にのみ定期的なジョブをキューに入れます。
これはきわめて簡単な例ですが、クロックプロセスの記事ですでに説明されている理由から、クロックプロセス自体では何も行う必要がない点に注意することが重要です。代わりに、クロックプロセスから起動される実際の作業を実行するバックグラウンドジョブをスケジュールします。
クロックプロセスのタイプ
最後に、Procfile でプロセスタイプを定義する必要があります。この例では、プロセス clock
を呼び出すため、Procfile は次のようになります。
clock: python clock.py
デプロイ
requirements.txt
、Procfile
、clock.py
の変更をコミットし、git push heroku master
を使用してアプリケーションを再デプロイします。
最後のステップでは、クロックプロセスをスケールアップします。これはシングルトンプロセスであるため、これらのプロセスを 2 つ以上にスケールアップする必要はありません。2 つを実行すると、作業が複製されます。
$ heroku ps:scale clock=1
Heroku ログに、次のような出力が表示されます。
2023-05-30T20:59:38+00:00 heroku[clock.1]: State changed from created to starting
2023-05-30T20:59:38+00:00 heroku[api]: Scale to clock=1, web=3 by user@heroku.com
2023-05-30T20:59:40+00:00 heroku[clock.1]: Starting process with command `python clock.py`
2023-05-30T20:59:41+00:00 heroku[clock.1]: State changed from starting to up
2023-05-30T20:59:48+00:00 app[clock.1]: Starting clock for 1 events: [ Queueing interval job ]
2023-05-30T20:59:48+00:00 app[clock.1]: Queuing scheduled jobs
これで、カスタムクロックプロセスが稼働するようになりました。詳細は、APScheduler のドキュメントを確認してください。