🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

ループ

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

Python

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

Q&A

解決済

2回答

3963閲覧

開始時刻・終了時刻を指定したwhileループ処理方法

Lee1

総合スコア3

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

ループ

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

Python

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

0グッド

1クリップ

投稿2021/03/27 01:37

Pythonを用いて開始時間と終了時間を指定したループ処理による解析を行いたいと思っています。
scheduleを使って10時00分にスタートし20時00分までwhileループを続けさせようとしましたが、当然ながらwhileループから抜け出すことは出来ませんでした。
調べてみると、thredingやifを組み込むことによりループスタート後n分後に終了させるという方法は見つかりましたが、××時○○分に終了するといったような方法を見つけることが出来ませんでした。
時刻指定をしてループを開始・終了させる方法に関してヒントを頂けますと幸いです。
どうぞよろしくお願い致します。

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

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

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

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

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

takasima20

2021/03/27 02:17

ループ内ではどのようなことをどれくらいの頻度でやってんスか?
guest

回答2

0

ベストアンサー

ループスタート後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に表示したい場合、等)

投稿2021/03/27 05:59

teamikl

総合スコア8729

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

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

0

現在時を読み出して、終了時と同じか過ぎていればループから抜けるようにすればいいです

投稿2021/03/27 01:38

y_waiwai

総合スコア88038

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問