我应该如何申请一个非阻塞锁?
为什么不Ruby的文件#羊群如预期工作时单独尝试以锁定文件? 锁定在一个块中的文件不是针对此问题的正确解决方案,因为该点是展示持久锁锁定的行为。 使用文件#羊群块内释放锁当块退出,所以它不能正确说明问题。
文件#羊群多种方式发生故障,请求非阻塞锁时尤其如此。 下面是一些例子。
与文件#羊群失败的例子
使用多排它锁时,因为#flock不提供一种方式来超时锁定请求无限期等待。
# First lock succeeds. f1 = File.open('foo', File::RDWR|File::CREAT, 0644) f1.flock(File::LOCK_EX) # => 0 # This never returns. f2 = File.open('foo', File::RDWR|File::CREAT, 0644) f2.flock(File::LOCK_EX)
要求一个非阻塞的锁,而该文件是一个无效的参数异常独占锁定的结果。
f1 = File.open('foo', File::RDWR|File::CREAT, 0644) f1.flock(File::LOCK_EX) # => 0 f2 = File.open('foo', File::RDWR|File::CREAT, 0644) f2.flock(File::LOCK_NB) # => Errno::EINVAL: Invalid argument - foo
文档说#flock“锁定或解锁根据locking_constant一个文件(一个逻辑或在下面的表中的值的)。” 然而,逻辑或引发
Errno::EINVAL
或Errno::EBADF
取决于平台。f1 = File.open('foo', File::RDWR|File::CREAT, 0644) f1.flock(File::LOCK_EX) # => 0 f2 = File.open('foo', File::RDWR|File::CREAT, 0644) f2.flock(File::LOCK_NB || File::LOCK_EX) # => Errno::EINVAL: Invalid argument - foo
本地文件#羊群中优选的
虽然人们可能使用超时模块 ,以提高Timeout::Error
当无法获取排它锁,好像文件#羊群应该能够解决原生这个问题。 那么,如何在一个实际上应该请求独占锁不阻塞?