【Python】Scheduleモジュールを用いたイベント定期実行|指定時間動作のスケジュール関数作成例と使い方解説

こんにちは、Kosei(@kay_diacc2)です!

「Pythonスクリプトを一度きりではなく、定期的に実行できるようにしたい」加えて「定期的な実行条件は細かく定義したい」本記事ではこのような要望に回答します。具体的に「スケジュール(Schedule)モジュールを活用した定期実行処理の組み立て方法」について詳しく解説します。

目次

Scheduleモジュールとは

図:Scheduleモジュールとは?

scheduleとは一定の間隔(数分・数時間・数日おき)で同じ作業を実行できるようにする便利なモジュールです。例えば下記のような用途で利用されます。

  • 1日3回データを自動集計する
  • 1週間おきにレポートを更新する
  • 1ヶ月おきに通知メールを送信する

イベント処理・定期実行関数の組み立て手順

Pythonを用いて定期実行処理を実現するために、「作業内容を記述した実行関数」と「定期実行(スケジュール)の条件を記載したイベント関数」の2つを準備します。

本記事では下記の手順に沿ってこれら2つの関数を準備することとします。

  1. 定期実行する実行関数を準備
  2. スケジュールを登録
  3. スケジュール処理(イベント)実行

定期実行環境の構築には、事前にscheduleモジュールのインストールが必要です。下記をコマンドラインに入力し、インストールを済ませておきましょう。

pip install schedule

定期実行する実行関数を準備

定期的な処理を実行する関数を準備します。今回はテスト用として下記の関数を定期実行してみます。既にお手元にpythonスクリプトがあればそちらを用いられても問題なしです。

#01 定期実行する関数を準備
def task():
    print("タスク実行中")

スケジュールを登録

作業を実行するための定期(イベント)条件はschedule.every()メソッド、実行する関数はdo()メソッドを用いて登録します。以下記載例を示します。

定期的な実行条件を設定

2秒毎にtask()関数を実行 schedule.every(2).seconds.do(task)
2分毎にtask()関数を実行 schedule.every(2).minutes.do(task)
2時間毎にtask()関数を実行 schedule.every(2).hours.do(task)
2日毎にtask()関数を実行 schedule.every(2).days.do(task)
2週間毎にtask()関数を実行 schedule.every(2).weeks.do(task)
40秒時点で毎分タスク関数を実行 schedule.every().minute.at(“:40”).do(task)
35分時点で毎時間タスク関数を実行 schedule.every().hour.at(“:35”).do(task)
12時20分時点で毎日タスク関数を実行 schedule.every().day.at(“12:20”).do(task)
毎週月曜日の15:40にタスク関数を実行 schedule.every().monday.at(“15:40”).do(task)

スケジュール処理を定期実行

上記で登録した定期条件および実行関数は、schedule.run_pending()メソッドによって起動できます。ここで、schedule.run_pending()を呼び出すのみだと、一度関数を実行して処理が終了してしまいます。そのため、下記のようにwhile文で無限ループするよう指定するのが一般的です。無限ループを指定することで同じ関数(処理)を一定の間隔で繰り返すことができるようになります。

while True:
    schedule.run_pending()
    sleep(1)

定期実行処理のプログラム組み立て事例

最後に上記手順を総括して作成した定期実行処理のスクリプト例をご紹介します。

10秒おきに関数を定期実行する場合

#00 ライブラリをインポート
import schedule
from time import sleep

#01 定期実行する関数を準備
def task():
    print("タスク実行中")
    
#02 スケジュール登録
schedule.every(10).seconds.do(task)


#03 イベント実行
while True:
    schedule.run_pending()
    sleep(1)

10秒おきに引数を有する関数を定期実行する場合

#00 ライブラリをインポート
import schedule
from time import sleep

#01 定期実行する関数を準備
def task(work):
    print(work+"タスク実行中")
    
#02 スケジュール登録(01実行関数の引数はdoメソッドの第二引数として指定)
schedule.every(10).seconds.do(task,work="プログラム")

#03 イベント実行
while True:
    schedule.run_pending()
    sleep(1)

毎日7:00に関数を定期実行する場合

#00 ライブラリをインポート
import schedule
from time import sleep

#01 定期実行する関数を準備
def task():
    print("タスク実行中")
    
#02 スケジュール登録
schedule.every().days.at("7:00").do(task)


#03 イベント実行
while True:
    schedule.run_pending()
    sleep(1)

22:00まで関数を30秒おきに定期実行する場合

#00 ライブラリをインポート
import schedule
from time import sleep
from datetime import datetime,date

#01 定期実行する関数を準備
def task():
    print("タスク実行中")
    
#02 スケジュール登録
schedule.every(30).seconds.do(task)

#02 何時まで実行するか定義
year   = date.today().year
month  = date.today().month
hour   = 22
minute = 0
second = 0
set_until_time = datetime(year,month,date.today().day,hour,minute,second)

#03 イベント実行 (特定の時間が来るまで定期実行)
while datetime.now() < set_until_time:
    schedule.run_pending()
    sleep(1)

【参考】Pythonの自作関数をクラウドで定期実行する方法

本記事ではクラウド上でPython関数を定期実行する方法も解説しています。

最後に

この記事が気に入ったら
フォローしてね!

本記事をシェア!
URLをコピーする
URLをコピーしました!
目次
閉じる