[Python]Scheduleライブラリの検証

PythonのScheduleライブラリがテーマのため、今回はTwitterApiキーは不要です。

Scheduleライブラリの機能確認をします。
Schedule公式
公式ドキュメントに説明がありますが、細かいところは実際の動作を確認します。
下記のScheduleの定時タスクと定期タスクの機能、

・定時機能の指定できる範囲
・定期機能の実行タイミング

これらを確認・検証した。

定時タスク

指定した時刻、曜日を経過した後に実行する。

動作確認コード

[github]every_tester.py
特に解説しません。

範囲

最小:毎分指定(例:毎分15秒に実行される)
最大:毎曜日指定(例:毎週水曜日の17時に実行される)

できないこと

日付指定(月単位以上)のスケジュール実行

例)

・毎月10日15:30に実行
・毎年4月1日10:00に実行
・2025年12月31日23:59に実行

これらはScheduleライブラリでは実装できない。

定時タスクまとめ

・単位時間より短い間隔の定時タスクを設定したい場合、毎時指定を複数設定することが実用的。例えば15分間隔でタスクを設定する場合、

・毎時00分
・毎時15分
・毎時30分
・毎時45分

 の4つタスクを作成し同じジョブを割り当てる。
・日付を組み込みたい場合、date等で日付を取得して分岐処理などする。
・分単位のタスクは人間の時間感覚で使うには間隔が短すぎるが、後述する定期タスクには時差が積み重なることがあるため、定期タイミングを得るために利用しても良い。その場合はpending間隔を30秒以下にする。

定期タスク

指定間隔(10分ごと、2時間に一回など)に実行する。

動作確認コード

[github]interval_tester.py
後述の検証参考。コード自体の解説は特にしません。

実行タイミング

 Scheduleは指定した時刻・間隔時間経過後にpendingが実行されると指定されたタスク(関数)が実行される。
 定期タスクの実行間隔はpendingによるタスク実行時からカウントされる。そのため定期タスクを6~9分間隔に設定してもpendingを5分間隔で動作した場合、実際には定期タスクは10分間隔で実行される。

定期タスクまとめ

 定期タスクの間隔とpendingの間隔が近い数値の場合、pendingの間隔を優先する。
 定期タスクとして使用する場合、pendingの間隔数値を定時タスクより十分に小さい値とする。この場合、定期タスクの経過とpending実行の時差が徐々に蓄積されていくことを留意する。

検証

 定期タスクを7秒間隔、pendingを5秒間隔で動作した場合のjob実行を検証する(動作確認コードを実行する)。

実行結果

>python3 interval_tester.py
開始
1秒経過
2秒経過
3秒経過
4秒経過
5秒経過
pending実行
6秒経過
7秒経過
8秒経過
9秒経過
10秒経過
pending実行
job実行
11秒経過
12秒経過
13秒経過
14秒経過
15秒経過
pending実行
16秒経過
17秒経過
18秒経過
19秒経過
20秒経過
pending実行
job実行
21秒経過
22秒経過
23秒経過
24秒経過
25秒経過
pending実行
終了

 10秒間隔でjobが実行される。
 タスク間隔がpendingに関係なくプログラム起動時からの間隔で動作する場合なら7秒、14秒、21秒...の直後のpending実行タイミングで実行されるため、3回目(15秒経過後のpending実行)でjobが実行されるがそのようにならない。タスクの実行間隔はpending実行後からカウントされることが確認できる。