実現したいこと
任意の間隔での関数の定周期実行
前回処理開始時 - (インターバル) - 今回処理開始
発生している問題・分からないこと
指定したインターバル間隔が処理終了時~次回処理開始となってしまう。
前回処理開始時 - 前回処理終了時 - (インターバル) - 今回処理開始
該当のソースコード
Python
1import time 2import schedule 3import datetime as dt 4 5INTERVAL = 10 6 7def main(): 8 scheduler = schedule.Scheduler() 9 scheduler.every(INTERVAL).seconds.do( 10 heavy_function 11 ) 12 13 while True: 14 scheduler.run_pending() 15 time.sleep(0.1) 16 17 18def heavy_function(): 19 start_time = dt.datetime.now(tz=dt.timezone.utc) 20 print(f'start: {start_time}') 21 time.sleep(5) 22 end_time = dt.datetime.now(tz=dt.timezone.utc) 23 print(f'end: {end_time}') 24 25 26if __name__ == '__main__': 27 main()
Condole
1start: 2024-12-05 03:22:14.116578+00:00 2end: 2024-12-05 03:22:19.121740+00:00 3start: 2024-12-05 03:22:29.145224+00:00 4end: 2024-12-05 03:22:34.150440+00:00 5start: 2024-12-05 03:22:44.174894+00:00 6end: 2024-12-05 03:22:49.180033+00:00
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
実現したいことを実施する方法が見つかりませんでした。
補足
特になし
私の環境では「python schedule」でgoogle検索すると以下の記事が
6番目に表示されています。(私が書いた記事ではありません。)
https://progzakki.sanachan.com/program-lang/python/schedule-job-periodically/
続きはこちら。
https://progzakki.sanachan.com/program-lang/python/signal-handler-periodically/
python単体で完結できませんが、cronとかタスクスケジューラなんかと
併用しても良いかもしれません。
「scheduleモジュールを使用して」というのが必須なら難しいと思います。jobを別スレッドにする方法もありますが、起動時間のズレが積み重なっていくのは消せません。(それぐらいのズレが許容できるならscheduleでスレッドなりを使えばいいと思います)
他のライブラリでもいいなら、apscheduler でご希望の動作ができると思います。

回答1件
あなたの回答
tips
プレビュー