Ruby Tips!

RubyのTipsを紹介します

ファイルをロックする

ファイルのロックには共有ロックと排他ロックがある。共有ロックは主に読み込み時に使用し、排他ロックは主に書き込み時に使用する。

RubyでファイルをロックするにはFile#flockを使う。共有ロックを行うにはFile::LOCK_SHを、排他ロックを行うにはFile::LOCK_EXを指定する。

open('foo.txt'){|f|
  f.flock(File::LOCK_SH) # 共有ロック
  f.read
}
open('foo.txt'){|f|
  f.flock(File::LOCK_EX) # 排他ロック
  f.write "hoge"
}

ファイルのロックはファイルが閉じられると自動的に開放される。明示的にロックを開放するには、File::LOCK_UNを指定してFile#flockを呼びだせば良い。

File#flockはファイルがロックできない場合、ロックできるまでブロッキングする。File#flockブロッキングさせないようにするには、File::LOCK_NBを指定する。以下はファイルがロックできるまで、1秒おきに再試行する例である。

open('foo.txt'){|f|
  until f.flock(File::LOCK_EX | File::LOCK_NB)
    sleep 1
  end
}