1
0

More than 1 year has passed since last update.

無限ループはめっちゃでかい有限ループにしておけ

Last updated at Posted at 2021-12-10

何があったのか

処理対象がなくなるまでループ処理することってありますよね。
そんなときついつい無限ループ+終了時にbreakってやってしまいがちですが。

example.rb
i = 0
while true do
    break unless calcurate_function(i) #処理対象がなかったらfalseを返す
    i += 1
end

何らかの不具合で、calcurate_functionが処理対象がなくなってもtrueを返し続けたら・・・。無限ループの完成です。
手動で動かしたバッチならしばらく経ってから異変に気付いてプロセスをkillしたりもできますが、これが深夜に自動で動いているバッチ処理だったとしたら・・・。

私はこれで本番サーバをフリーズさせて、IDCまで電源をいれに行ったことがあります。

どうすればよかったのか

それ以来無限ループ恐怖症になり、必ず有限ループにしています。

example.rb
# 仕様上そんなにループすることのないはずのめっちゃでかい数字
MAX_LOOP = 999_999_999

i = 0
while i < MAX_LOOP do
    break unless calcurate_function(i) #処理対象がなかったらfalseを返す
    i += 1
end

これはこれで、いつかMAX_LOOPを超える回数ループする必要が出た時にどうするんだという話もありますが、未来の自分のことまで考えるなら、終了時にやり残しがないかチェックをすることくらいでしょうか。

一番良いのはジョブスケジューリングツールでバッチプロセスを監視して、異常に長い時間動いているプロセスがあったら通知してくれたりすることなんですけどね。

1
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
1
0