ループスタート後n分後に終了させるという方法は見つかりましたが、
××時○○分に終了するといったような方法を見つけることが出来ませんでした。
一定時間後に実行と、指定時間に実行は相互に置き換え可能で、
予定の時間 - 現在の時間で 残り時間 (n分後) を求められます。
以下は余談
時刻指定をしてループを開始・終了させる方法に関してヒントを頂けますと幸いです。
- 現在時刻から開始時間:終了時間を求める
- 一定時間後に解析処理を開始
- 一定時間後に終了要求をだす (解析処理のループを抜けるようにする)
実行時間の管理と解析処理は、別スレッドにする方が良いです。
ループ文を使わずにスケジューラ内で解析処理を実行する方法もありますが、
ループ毎に時間チェックが入る事になるので、遅延になります。
速度的にはデメリットになるので、
解析用途(CPUバウンドな処理を想定)には向きません。
スケジューラの選択肢は、スレッドを使う方法、イベントループのタイマーを使う方法
具体的にはメインスレッドで何を行うかによって適切な方法は変わってきます。
- threading.Timer
- sched 標準ライブラリのスケジューラー
- asyncio 等 非同期IO
- tkinter 等 GUIライブラリの提供するもの
終了方法については、具体的なコードが提示されないと言及が難しい箇所ですが
- スレッド/プロセス単位では強制終了の操作しかできません。
→ 処理内容次第では安全な操作ではない
ユーザの責任で安全にループを終了させる必要があります。
→ 終了の仕組みは独自に実装する
一般的な構造では (concurrent モジュール等を使わない場合)
python
1def loop():
2 初期化
3 while FLAG: # <-- 終了要求により FLAG を False にして 後始末が実行されるようにする
4 解析処理
5 後始末
但し、別プロセスの場合は更に工夫が必要で、FLAGに共有メモリを使ったり、
より効率化を図るなら、別スレッドやシグナルで要求通知を受け取る等の対策が必要。
別プロセスにする場合は、メイン・プロセス側のスケジューラーから開始し、
サブ・プロセス側で threading.Timer を使い一定時間経過後に終了、
という組み合わせも考えられます。この辺りは要件次第。
(要件: 一時停止や中断したい場合、進捗をGUIに表示したい場合、等)