我有两个进程之间的并发问题,经过短暂的研究,我发现temporary file
是这个问题的建议解决方案。
因此,解决方案是创建/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?()
?如果有最好的方法,我也很想听听。
3条答案
按热度按时间mzsu5hc01#
@bjhaid的回答可能会导致一个问题,那就是在Rubinius中,#timeout会导致一个解释器错误。这也是不必要的复杂。
这里有一个更简单的版本,使用非阻塞锁而不是超时:
sdnqo3pr2#
当你对一个文件有一个排他锁时,试图在ruby中再次锁定它将无限期地等待,直到文件被解锁,所以你可以依靠它,并设置一个超时多长时间ruby应该等待,这可能不是最合适的方法,但我会这样做:
ebdffaop3#
我为此创建了一个简单的Mutex类