在进行了短暂的研究后,我发现两个进程之间存在并发问题,临时文件被建议作为此问题的解决方案。
因此,解决方案是创建/tmp/global.lock
并将其用作全局锁。 我在这个线程中找到了一个示例:Mutex for Rails Processes
到目前为止,对我来说是有道理的,但我想看看这种解决方案的最佳实践。上面的解释是有道理的,但我想知道如何检查给定的文件是否已锁定?
fh = File.open("/some/file/path", File::CREAT)
begin
if locked = check_file_locked?
sleep(1)
else
fh.flock(File::LOCK_EX)
# do what you need to do
end
ensure
fh.flock(File::LOCK_UN)
end
这是我对解决方案的理解,不确定如何实现提到的
check_file_locked?()
函数?如果有更好的方法,请告诉我。
open(path) do |f|...end
),则可以同时删除LOCK_UN
操作和显式关闭。此外,如果使用block from,则即使发生异常,锁也会被释放。 - hagello