0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

備忘録Advent Calendar 2023

Day 2

while True の備忘録

Last updated at Posted at 2023-12-09

はじめに

while Trueの備忘録です💁
初心者です😅
間違えてる部分多々あると思います。
もし見つけた場合、ツッコミいただけると助かります🙇

私は今回、サーバーからのレスポンス待ちをする際に利用しました。

🦁 結論 🦁

押さえておくべき点

  • while文は条件を満たすあいだはループを繰り返す。
  • ループの途中で別の条件が満たされた場合には「break」を使うことでループ処理を抜ける(処理待ちのときに使う(レスポンスを待つ、ユーザーからの入力待ち、イベント発生待ちなど)
  • continueは通常は不要であるが,指定された条件が真の場合には何もしないで,ループ処理を繰り返す
  • ループ処理の最後に指定されたelse句はループ処理の最後に実行される

注意点

  • 無限ループのため大容量の処理などをする時には負荷を軽減したりするためのコントロールが必須(スリープ処理、最大待ち時間の設定など)

基本構文

sample.py
while 条件:  # 条件が満たされる間,以下を繰り返す(場合によっては True を指定する(無限ループ)こともある 
    if 別の条件:  # while ループを終了すべき何らかの条件をチェックする
        # 必要な処理を実行後
        break  # ループを抜ける
    # それ以外の場合の処理(これこそが主要な処理)
sample.py
import time

# 最大待機時間と待機間隔(秒)
MAX_WAIT_TIME = 180
POLL_INTERVAL = 10

start_time = time.time()  # ループ処理を開始する直前の時間

while True:
    # ここでサーバーからのレスポンスをチェックする仮想的なコード
    # response = check_server_response()
    response = {"status": "RUNNING"}  # 仮のレスポンス

    if response["status"] == "SUCCEEDED":
        # 条件が満たされた場合の処理
        print("処理成功: サーバーからのレスポンスがSUCCEEDEDです。")
        break  # ループを抜ける
    elif response["status"] == "RUNNING":
        # RUNNING状態では、待機せずに次のイテレーションへ
        print("処理中: サーバーからのレスポンスがRUNNINGです。")
        continue  # 待機スキップ
    else:
        print("未知のレスポンス: ", response["status"])
        # 未知のレスポンスの場合は、一定時間スリープ
        time.sleep(POLL_INTERVAL)

    # タイムアウトのチェック
    if time.time() - start_time > MAX_WAIT_TIME:
        print("タイムアウト:処理が完了しませんでした。")
        break
    # ループごとに実行されることの記述
    # 今の場合は,「何も実行しない」

具体例の解説

ifによって作られた条件分岐をいくつか作ることによって「break」をループ処理(待機処理など)を完了させるものとループ処理をし続けるものを条件分岐できる。

①のif

statusが「SUCCEEDED」になったから、特定の処理をして実行して「ループ処理を抜ける」

②のif(elif)

サーバーからのレスポンスにあるstatusが「RUNNING」になってるので特定の処理を実行して「ループ処理継続」
continueにてその後の処理をスキップしてループ処理に戻る。

③のif

最大の待機時間を設定して超えてしまった場合、特定の処理を実行して「ループ処理を抜ける」

それ以外

何もしないで,次を待つ

timeの補足

押さえておくべき点

  • time.time() は現在の時刻をUNIXエポック(1970年1月1日からの経過秒数)で返す
  • start_time は、ループを開始する前に設定された時刻(同じくUNIXエポックでの秒数)
  • MAX_WAIT_TIME は、待機する最大秒数
0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?