ファイルのロック
ファイルに排他をかけるには
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)に
一定期間スレッドをスリープさせて何回かリトライさせるべきなのか。
後者の方が安全だろうなぁ。