
日々の自動化スクリプトやWebアプリケーションのバックグラウンド処理などで、「指定した日時に処理を実行したい」「毎朝決まった時間にデータを収集したい」という場面は多いですよね。Linuxのcron機能を使うのも一つの手ですが、OSに依存せず、Pythonスクリプト内部で柔軟にスケジュールを完結させたいときに心強い味方となるのが「APScheduler(Advanced Python Scheduler)」です。
今回は、APSchedulerの概要や導入メリット、そして手軽に試せる実践的なサンプルコードをご紹介します。
APSchedulerとは?
APSchedulerは、Python標準ライブラリの threading や sched よりも高度で使いやすいジョブスケジューリングライブラリです。cronのような記法を用いた定期実行から、数秒・数分おきのインターバル実行、さらには一度きりの日時指定実行まで、多彩なトリガーをサポートしています。
Webフレームワーク(FastAPIやFlaskなど)と連携してバックグラウンドタスクを動かしたいときにも、とても重宝するライブラリです。
主なメリット
- プラットフォーム非依存: OSのタスクスケジューラやcronに頼らず、純粋なPython環境だけで完結します。
- 多彩なスケジューラ環境: スクリプト単体で動かす
BlockingScheduler、別スレッドで裏側で動くBackgroundScheduler、非同期処理に適合するAsyncIOSchedulerなど、用途に合わせた構成が選べます。 - 柔軟なトリガー設定: 「date(日時指定)」「interval(間隔実行)」「cron(cron記法による実行)」の3種類が用意されており、直感的な設定が可能です。
サンプルコード
最も手軽に導入できる、BlockingScheduler を用いたインターバル実行とcron風実行のコード例です。
pip install APSchedulerfrom datetime import datetime
from apscheduler.schedulers.blocking import BlockingScheduler
def interval_task():
print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] 5秒ごとの定期タスクです。")
def cron_task():
print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] 毎分00秒に実行されるcron風タスクです。")
if __name__ == '__main__':
scheduler = BlockingScheduler()
# 5秒おきに実行するジョブ
scheduler.add_job(interval_task, 'interval', seconds=5)
# 毎分00秒に実行するジョブ
scheduler.add_job(cron_task, 'cron', second=0)
print("スケジューラーを開始します。終了するには Ctrl+C を押してください。")
try:
scheduler.start()
except (KeyboardInterrupt, SystemExit):
scheduler.shutdown()
print("スケジューラーを停止しました。")コードを見ていただくと分かる通り、scheduler.add_job() に関数と実行間隔を渡すだけなので、直感的にジョブを登録できますね。
スケジューラーを開始します。終了するには Ctrl+C を押してください。
[2026-09-21 07:08:41] 5秒ごとの定期タスクです。
[2026-09-21 07:08:46] 5秒ごとの定期タスクです。
[2026-09-21 07:08:51] 5秒ごとの定期タスクです。
[2026-09-21 07:08:56] 5秒ごとの定期タスクです。
[2026-09-21 07:09:00] 毎分00秒に実行されるcron風タスクです。
[2026-09-21 07:09:01] 5秒ごとの定期タスクです。
スケジューラーを停止しました。みーちゃんのワンポイント
APSchedulerを使う際は、スケジューラ初期化時に明示的にタイムゾーン(例: timezone="Asia/Tokyo")を指定しておくのが鉄則です。また、Webアプリ等の常駐プロセスに組み込む場合は BlockingScheduler ではなく、別スレッドで動作する BackgroundScheduler を選び、メイン処理を妨げないように設計しましょう。

