無限ループは悪として教えられています。良い使用法はありますか?
それらを誤ってコーディングすると、特にループ内で変数を割り当てる場合に、CPU がピークに達し、メモリもピークに達すると思います。
有効な用途がある場合、それらの問題はどのように防止されますか?
無限ループは悪として教えられています。良い使用法はありますか?
それらを誤ってコーディングすると、特にループ内で変数を割り当てる場合に、CPU がピークに達し、メモリもピークに達すると思います。
有効な用途がある場合、それらの問題はどのように防止されますか?
基本的に、すべてのオペレーティング システムまたはサーバーは無限ループでスピンします。
通常、これらのメモリの問題を回避するには、後で同じループ内でメモリを解放できない限り、ループ内でメモリを割り当てません。たとえば、リクエストにメモリを割り当て、サービスが提供されたら削除します。
CPU のピークを回避するには、os の場合は割り込みを待機するか、反復ごとに 1 回新しいイベントを待機する poll() などのブロッキング関数を呼び出します。
まず、このフレーズの「無限」という言葉は、もう少し大まかに捉えるべきです。時間とすべての人類の終わりまで実行されるループとは対照的に、最終的に終了する命令のあるwhile (true)
ループについて話していると思います。break
前者の意味では、はい、それが適切なユースケースがあります:
不適切に使用される可能性のある例の 1 つは、CPU を回転させて時間遅延を作成するために使用される場合です。これは、初心者のプログラマーがタイマー割り込み (またはタイマー イベント、またはその他の非手続き型構造) の処理を避けるために行う傾向があることです。ただし、共有リソースを取得するために CPU の回転が行われる場合、「無限ループ」も完全に有効な実装の選択肢です。たとえば、.NET CLR モニターでさえ、カーネル イベント ハンドルで真の待機を発行し、より高価なスレッド スイッチを作成する前に、数百サイクルのスピンを試行します。
イベント ループで実行されるプログラム (@Christoph が言及するシステム プロセスなど) に加えて、一部の言語にはgeneratorと呼ばれる概念があり、無限ループを作成することを許可し、それを奨励することさえあります。秘訣は、オブジェクトが何らかの式を「生成」(返す) するときに、オブジェクトが有限時間だけ実行されることです。その後、その状態は再び必要になるまで「凍結」されます。たとえば、Python では、 と を交互に繰り返すオブジェクトを作成できLEFT
ますRIGHT
。
def side():
while True:
yield "LEFT"
yield "RIGHT"
a = side()
print a.next()
print a.next()
print a.next()
与えるだろうLEFT RIGHT LEFT
。このside
関数は、ステートメントで無限ループのように見えますが、While True:
呼び出しごとに有限の時間だけ実行されます。