質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2245閲覧

scheduleライブラリを使ったタイマーを2段階でタイマーセットしたい。

steppin-k

総合スコア1

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

0クリップ

投稿2020/09/21 21:59

編集2020/09/21 22:03

前提・実現したいこと

こんにちは、はじめてお尋ねします。

タイマーでPC処理が作動するRPAプログラムを作っています。
毎日指定時間9:00に作動、
scheduleライブラリのwhile trueを使ってセットします。

作動後の手順に少々時間を要するために、
作動ジョブを2回に分けています。
8:55分のタイマーはscheduleライブラリ無限ループで待機
9:00当刻のタイマーは1回だけ作動させて、schedule無限ループを抜ける。
8:55の関数待機に戻る

という
scheduleのwhile Trueのループを2段階でタイマーセットしたいのですが、
無限ループが行ってしまい設定することができない状況です。
ご教授いただけないでしょうか。

発生している問題・エラーメッセージ

2回目に作動させるジョブをschedule無限ループから抜け出させる処理、1回で終わらせる処理は書けたのですが、
両方の関数を連動させたとき、
while Trueの無限ループが関数でまたがっているからか、ループのエラーが行ってしまいます。
1回目のループから無限ループに陥ります。

errormessage

1debug.py", line 35, in <module> 2 schedule.run_pending() 3Programs\Python\Python38-32\lib\site-packages\schedule\__init__.py", line 563, in run_pending 4 default_scheduler.run_pending() 5Programs\Python\Python38-32\lib\site-packages\schedule\__init__.py", line 94, in run_pending 6 self._run_job(job) 7Programs\Python\Python38-32\lib\site-packages\schedule\__init__.py", line 147, in _run_job 8 ret = job.run() 9Programs\Python\Python38-32\lib\site-packages\schedule\__init__.py", line 466, in run 10 ret = self.job_func() 11debug.py", line 30, in controljob 12 debug2.gymjob() 13debug2.py", line 24, in gymjob

該当のソースコード

デバッグ用のサンプルコードです。
debug.py

python

1import schedule 2import time 3import datetime 4 5import debug2 6#1度目のスケジュール処理 7def controljob(): 8 debug2.gymjob() 9 10schedule.every().day.at("06:36").do(controljob) 11while True: 12 schedule.run_pending() 13 time.sleep(1)

debug2.py

python

1import schedule 2import time 3import datetime 4 5#2度目のスケジュール処理 6 7flag = 0 8def gymjob2(): 9 print("gymjob2作動") 10 global flag 11 flag = flag + 1 12 print(flag, "終了フラグが立ちました") 13 14def gymjob(): 15 global flag 16 print("gymjob作動") 17 schedule.every().day.at("06:37").do(gymjob2) 18 while True: 19 schedule.run_pending() 20 time.sleep(1) 21 if flag == 1: 22 break

試したこと

片方のみをscheduleセットにすると、scheduleは問題なく動くのですが、
両方のscheduleを動かそうとすると、1回目のwhile Trueループが無限ループされるようになってしまいます。

環境

windows10
python3.8
editor:Atom

teamikl👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

問題点:

# 通常の挙動 - run_pending() 内 - gymjob() # run_peinding()の実行が終わるとジョブが消化されます - time.sleep(1) - run_pending() - ... # 2重にした場合 - run_pending() - gymjob() - run_pending() - gymjob() # run_peinding() 内で呼ばれている為現在のジョブが残っている - run_peinding() - gymjob() ...

作動後の手順に少々時間を要するために、

スケジューラーを2重にするのではなく、
時間の掛かる処理を別スレッドで処理するようにするとよいです。

スレッドとキューを用いたサンプルコードがあります。

  • ジョブではキューにデータを入れるのみにして、すぐにrun_pending()のループに処理を戻す
  • 別スレッドでキューを読み出し処理します
  • 複数のジョブを並行して処理したい場合は、

 concurrentモジュールのProcess/ThreadPoolExecutor を使う。

投稿2020/09/21 23:37

teamikl

総合スコア8760

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

steppin-k

2020/09/22 01:20

早速回答いただきありがとうございます。 並列処理を行うのですね。勉強不足で、まずはスレッドの処理の習得、検証してまいりたいと思います。 ループの原因も理解できました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問