やったこと
File の flock について挙動を確認しました。
確認環境
$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin17]
$ rails --version
Rails 5.2.3
調査
排他ロックを使う
コンソール1
$ rails c
Running via Spring preloader in process 31090
Loading development environment (Rails 5.2.3)
irb(main):001:0> f = File.open("/tmp/foo", "w")
=> #<File:/tmp/foo>
irb(main):002:0> f.flock(File::LOCK_EX)
=> 0
コンソール2
$ rails c
Running via Spring preloader in process 31491
Loading development environment (Rails 5.2.3)
irb(main):001:0> f = File.open("/tmp/foo", "w")
=> #<File:/tmp/foo>
irb(main):002:0> f.flock(File::LOCK_EX)
コンソール2は止まっています。
コンソール1 (unlockする)
irb(main):003:0> f.flock(File::LOCK_UN)
=> 0
コンソール2
irb(main):002:0> f.flock(File::LOCK_EX)
=> 0
排他ロックされている場合、待たせない
コンソール1
$ rails c
Running via Spring preloader in process 33223
Loading development environment (Rails 5.2.3)
irb(main):001:0> f = File.open("/tmp/foo", "w")
=> #<File:/tmp/foo>
irb(main):002:0> f.flock(File::LOCK_EX | File::LOCK_NB)
=> 0
コンソール2
$ rails c
Running via Spring preloader in process 33627
Loading development environment (Rails 5.2.3)
irb(main):001:0> f = File.open("/tmp/foo", "w")
=> #<File:/tmp/foo>
irb(main):002:0> f.flock(File::LOCK_EX | File::LOCK_NB)
=> false
先に排他的ロックが取られている場合、処理を待つことなく false
が返されました。