7

私がちょうど考えたこと:

Django サイトのビュー コードを書いていて、間違いを犯して無限ループを作成したとします。

誰かがビューにアクセスしようとするたびに、リクエストに割り当てられたワーカー (Gevent ワーカーまたは Python スレッド) は無期限にループに留まります。

私の理解が正しければ、サーバーは 30 秒後にクライアントにタイムアウト エラーを送信します。しかし、Python ワーカーはどうなるでしょうか? 無期限に稼働し続けますか?それは危険ですね!

10 個のワーカーを割り当てたサーバーがあるとします。私はそれを実行させ、ある時点で、クライアントが無限ループでビューにアクセスしようとしました。ワーカーが割り当てられ、次のサーバーの再起動まで事実上停止します。危険なのは、最初は気付かないことです。なぜなら、10 人ではなく 9 人のワーカーがいると、サイトがいつの間にか遅くなるからです。サイトは次第に遅くなり、最終的には 1 つのワーカーだけで非常に遅くなります。

サーバーを再起動すれば問題は解決しますが、サイトの機能がサーバーの再起動に依存するのは嫌です。

これは実際に発生する問題ですか?それを回避する方法はありますか?

更新:無限ループに陥っているスレッド/ワーカーのスタックトレースを取得する方法も本当にありがたいので、それをメールで送信して問題を認識できるようにします。(例外が発生していないため、これを行う方法がわかりません。)

「無限ループを含むコードを書くのは避ける」という趣旨のことを言っている人々への更新: 明らかでない場合のために、私は自分の自由時間を故意に自分のコードに無限ループを入れることはしません。これらのことが起こった場合、それは間違いであり、間違いを最小限に抑えることはできますが、完全に回避することはできません. 間違いを犯した場合でも、通知して問題を修正できるセーフティネットがあることを知りたい.

4

3 に答える 3

2

これを Django の開発サーバーでテストしました。

結果:

  • 30 秒後にタイムアウトしません。(これは本番サーバーではないためかもしれません)
  • ページを閉じるまで読み込み中のままです。

実際にそのようなコードを回避するだけでなく、それを回避する1つの方法は、スレッドを使用してタイムアウトを制御し、スレッドを停止できるようにすることだと思います。

たぶん次のようなもの:

import threading
from django.http import HttpResponse

class MyThread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
    def run(self):
        print "your possible infinite loop code here"

def possible_loop_view(request):
    thread = MyThread()
    thread.start()
    return HttpResponse("html response")
于 2013-04-27T13:33:48.823 に答える
0

はい、あなたの分析は正しいです。ワーカー スレッド/プロセスは引き続き実行されます。さらに、ループに待機/スリープがない場合、CPU を占有します。他のスレッド/プロセスはほとんど CPU を使用しないため、サイト全体の応答が遅くなります。

また、サーバーがタイムアウトエラーをクライアントに明示的に送信するとは思わない。TCP タイムアウトが設定されている場合、TCP 接続は閉じられます。

クライアントには、応答を取得するためのタイムアウト設定もある場合があり、これが明らかになる場合があります。

このようなコードを回避することは、そのようなコードを回避する最善の方法です。サーバーに監視ツールを配置して、CPU/メモリの使用状況を調べ、異常なアクティビティを通知して、アクションを実行できるようにすることもできます。

于 2013-04-27T13:25:23.913 に答える