File#flock を使ってみる (Ruby)
Ruby
Published: 2019-10-20

やったこと

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 が返されました。

参考