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?

え、まだ無限ループでサーバーダウンしてるんですか?動画では言えなかった補足

0
Last updated at Posted at 2026-08-08

はじめに

「while Trueで回し続ければ確実に処理できる!」

え、まだ終了条件なしのループを書いてるんですか?これ本番に出すと数秒でサーバーが応答停止します

この記事で解決すること

動画「【恐怖】無限ループでサーバーダウン」の補足記事です。
動画では時間の都合で触れられなかった詳細を解説します。


問題:なぜこれが危険なのか

え、まだ終了条件なしのループを書いてるんですか?これ本番に出すと数秒でサーバーが応答停止します


解決策:明日から使えるベストプラクティス

必ず終了条件を設定し、タイムアウト処理とエラーハンドリングを追加する

以下は、YouTube動画や社内勉強会でそのまま使える構成の具体例です。


問題:なぜこれが危険なのか

え、まだ終了条件なしのループを書いてるんですか?
無限ループはCPUを占有し続け、APIサーバーやバッチ処理を停止させる原因になります。特に本番環境では、リクエスト処理が滞り、サービス全体に影響を及ぼすことがあります。

例えば、こんなコードです。

❌ 終了条件のないループ

while True:
    print("データを処理中...")

実行すると、

  • CPU使用率が上昇する
  • プログラムが終了しない
  • サーバーのリソースを消費し続ける

結果として、他の処理にも悪影響を与える可能性があります。


APIの待ち合わせでも同じ

❌ レスポンスを永遠に待つ

import requests

while True:
    response = requests.get(
        "https://example.com/api/status"
    )

    if response.json()["status"] == "completed":
        break

一見問題なさそうですが、

  • APIが障害で停止している
  • ネットワークが切断された
  • completedが返ってこない

場合、このループは永久に終了しません。


解決策:明日から使えるベストプラクティス

終了条件・タイムアウト・例外処理を必ず実装しましょう。

✅ 改善版

import time
import requests

MAX_RETRY = 10

for attempt in range(MAX_RETRY):

    try:
        response = requests.get(
            "https://example.com/api/status",
            timeout=5
        )

        if response.json()["status"] == "completed":
            print("処理完了")
            break

        print("まだ処理中...")
        time.sleep(1)

    except requests.Timeout:
        print("タイムアウト")

    except requests.RequestException as e:
        print(f"通信エラー: {e}")

else:
    print("最大試行回数を超えました")

このコードでは、

  • 最大10回で終了
  • 通信タイムアウトを5秒に設定
  • 通信エラーを適切に処理
  • 1秒待機してAPIへの負荷を軽減

と、安全に実装されています。


バグになりやすい例

❌ フラグを更新し忘れる

finished = False

while not finished:
    print("処理中...")

finishedが一度もTrueにならないため、

永久ループになります。


✅ 条件を更新する

finished = False
count = 0

while not finished:

    print("処理中...")

    count += 1

    if count >= 5:
        finished = True

これなら5回で終了します。


サーバー処理でも危険

❌ キューを待ち続ける

while True:
    task = queue.get()

    process(task)

例外が発生すると、

処理停止

あるいは逆に異常状態のままループし続けることがあります。


✅ エラーハンドリングを追加

while True:

    try:
        task = queue.get(timeout=10)

        process(task)

    except Empty:
        print("タスク待機中")

    except Exception as e:
        print(e)
        break

想定外のエラー時はログを残して終了できるため、障害調査もしやすくなります。


明日から実践できるチェックリスト

  • while Trueを使う理由を明確にする
  • 必ず終了条件(breakや最大試行回数)を設ける
  • 外部APIやデータベース通信にはタイムアウトを設定する
  • try-exceptで例外を適切に処理する
  • リトライ時はtime.sleep()などで待機時間を設け、過剰な負荷を避ける

まとめ

「いつか終わるはず」ではなく、「必ず終わる設計」にすることが重要です。

終了条件のないループは、本番環境でCPUやサーバー資源を使い続け、サービス停止につながる原因になります。終了条件・タイムアウト・例外処理・最大試行回数を組み合わせることで、安全で保守しやすいプログラムを実現できます。


まとめ

無限ループを卒業して、安全なループ設計を習得しましょう!

#まだやってるんですか #コードの女神はみた #プログラミングスキル


動画で見る

YouTubeショート動画でも同じテーマを解説しています👇

https://youtube.com/shorts/FMws3Iov390

チャンネル登録・高評価もよろしくお願いします 🔔


この記事は「コードの女神は見た!」チャンネルの連動記事です。

0
0
0

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?