ファイルのロック

ファイルに排他をかけるには

File.flock

を使用する。

File::LOCK_EX

  • 排他ロック。同時にはただひとつのプロセスだけがロックを保持できます。
file = File.open("lock.txt" , "r")
p file.flock(File::LOCK_EX)

puts "unlock ?"
STDIN.gets()

p file.flock(File::LOCK_UN)

上記ロジックを別々のプロセスで実行すると
後からロックしようとしたプロセスは、ロックが解除されるまで待たされる。

File::LOCK_EX|File::LOCK_NB

  • ノンブロックモード。
file = File.open("lock.txt" , "r")
p file.flock(File::LOCK_EX|FILE::LOCK_NB)

puts "unlock ?"
STDIN.gets()

p file.flock(File::LOCK_UN)

上記ロジックを別々のプロセスで実行すると
後からロックしようとしたプロセスは、
ロックに失敗するとflockでfalseが返ってくる。



排他待ち(File::LOCK_EX)にさせるべきなのか、
排他待ちせず(File::LOCK_Ex|File::LOCK_NB)に
一定期間スレッドをスリープさせて何回かリトライさせるべきなのか。


後者の方が安全だろうなぁ。

追記

ロックをかけても、File.closeで閉じると排他も解除される。
それでもFile.flock(File::LOCK_UN)を行うと例外が発生する。

file_lock_a.rb:12:in `flock': closed stream (IOError)
        from file_lock_a.rb:12