ファイルをロックする
ファイルのロックには共有ロックと排他ロックがある。共有ロックは主に読み込み時に使用し、排他ロックは主に書き込み時に使用する。
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 }