質問: datetime.datetime.now() print(dt_now.strftime("%X")) ``` 今回、上記一連のあとに 当該アプリケーションが ループに入ってしまうため、 アプリ利用者とのやりとりが遮断されてしまわないよう 最後の関数実行を 別スレッドとして実行する手立てを採用しています(threading) ### 【達成したいこと】 登録されたスケジュールを1日の最後に クリアする「別の定刻処理」を 内部で勝手にスケジュール登録するようにしたいです。 ### 【分からないこと】 1日の最後に動作させる スケジュールクリアのための定刻処理の関数は、内部で(schedule.clear()の実施前に) schedule登録されていて直前まで起動が果たされたscheduleの完了を待つ必要がある認識です。 また、thread.joinというメソッドで 払出したスレッドについて、払出し側から その完了(払出したスレッド)を待つことができる認識をしています。 この結果からして...上記方針を達成する上で 払出し側のスレッドが すべての定刻処理で同一になるため このメソッドは 利用不可?ということになるでしょうか?? また、ここが一番分からないのですが 1日の最後に動作させる スケジュールクリアのための定刻処理だけ 先に紹介したtime_count関数を 別のスレッドで実行させる手立ても無きにしも非ずと考えるのですが、同一時間帯に、スレッドが別であろうと schedule.run_pending() が存在していて 良いの?? というところが疑問です。 当問合せ文を記載しながら今までに頂いたご見解を思い出したのですが、こういう制御は 固定名ファイルの配置・存在確認で回避する手立てが一般的でしょうか??
回答: マルチスレッドで迷い始めたら`図を書くこと`を推奨します。 自分ならどうするかを考えてみました。 * タイムテーブルにしたがってJOBを起動するスレッドJobDispatcherを作成する * JobDispatcherスレッドは00:00に起動し23:59に終了させる(23:59にJOBが終わっていない場合はjoinで待つ) * タイムテーブルの登録・削除はJobDispatcherスレッドの外、すなわちメインスレッドで行う * JobDispatcherスレッドはメインスレッドから起動する * メインスレッドは無限ループによりJobDispatcherが終了したらすぐにタイムテーブルの削除、再登録を行いJobDispatcherを再起動する これらを元に図を書くと以下のような感じでしょうか。 !スレッドの概念図