🐶

【Python】Apschedulerで定期処理を行いたい

2024/08/04に公開

はじめに

Pythonw使ったバックエンド開発を最近始めましたが、裏側で定期的にタスクを実行したいケースが出てきました。そこで、今回はAPScheduler (Advanced Python Scheduler) を使い、定期処理を行う方法について解説します。

前提

python:3.12.4
APScheduler:3.10.4

APSchedulerのインストール

まず、APSchedulerをインストールします。以下のコマンドを使用してインストールできます:

pip install apscheduler

基本的な使用方法

APSchedulerを使用するためには、スケジューラを作成し、ジョブを追加します。以下は、毎秒ごとにジョブを実行する簡単な例です:

from apscheduler.schedulers.background import BackgroundScheduler
import datetime


def my_job():
    print(f"Job executed at {datetime.datetime.now()}")

if __name__ == "__main__":
    scheduler = BackgroundScheduler()
    scheduler.add_job(my_job, 'interval', seconds=1)
    scheduler.start()

スケジューラの設定

スケジューラにはいくつかの種類があります。代表的なものは以下の通りです:

BlockingScheduler: このスケジューラは、ジョブの実行中にメインスレッドをブロックします。これは、スケジューラがメインプログラムとして動作し、他のコードの実行を許可しない場合に便利です。
BackgroundScheduler: このスケジューラは、バックグラウンドスレッドで動作し、メインスレッドをブロックしません。これにより、スケジューラはバックグラウンドでジョブを実行しながら、メインプログラムは他の作業を継続することができます。
AsyncIOScheduler: asyncioのイベントループで動作します。

次に、BackgroundSchedulerを例にスケジューラの設定を行います:

backgroundScheduler.py
from apscheduler.schedulers.blocking import BackgroundScheduler

scheduler = BackgroundScheduler()

ジョブの追加

ジョブを追加するには、add_jobメソッドを使用します。以下は、いくつかの異なるスケジュール方法の例です:

固定間隔での実行

scheduler.add_job(my_job, 'interval', seconds=5)

毎日特定の時間に実行

scheduler.add_job(my_job, 'cron', hour=14, minute=30)

特定の日時に一度だけ実行

run_date = datetime.datetime(2024, 7, 4, 12, 0, 0)
scheduler.add_job(my_job, 'date', run_date=run_date)

ジョブの管理

APSchedulerは、ジョブの管理を簡単に行うことができます。ジョブIDを指定してジョブを追加し、後でそのジョブを参照できます。

ジョブの追加と削除

job = scheduler.add_job(my_job, 'interval', seconds=10, id='my_job_id')

ジョブの削除

scheduler.remove_job('my_job_id')

ジョブの一覧表示

jobs = scheduler.get_jobs()
for job in jobs:
    print(f"Job ID: {job.id}, Next Run Time: {job.next_run_time}")

まとめ

APSchedulerを使用することで、Pythonアプリケーションで簡単にスケジュールされたジョブを管理できます。この記事では、基本的な使い方からジョブの管理方法までを紹介しました。これを参考に、様々な定期処理を効率的に実行できるようになると思います!

株式会社Xronotech

Discussion