我理解文件锁定的一般概念,但恐怕细节我不太清楚。我想打开一个文件进行写入,获取独占锁,但要等待几秒钟才能放弃获取锁。我到目前为止:
File.open(path, 'a') do |file|
if file.flock(File::LOCK_EX | File::LOCK_NB)
file.seek(0, IO::SEEK_END)
file.write('my content')
else
puts "Could not acquire lock, another process is using the file"
end
end
我如何等待锁x秒?
您可以自行设置超时处理,类似于以下代码。在这里,我们打开文件并尝试锁定它。如果锁定失败,我们将休眠 0.1 秒并重试,直到我们最多等待 5 秒(默认情况下)。如果超时,我们将引发错误。
请注意,以追加模式打开文件时,操作系统已经确保对同一文件的并发写入不会重叠。因此,如果多个进程以追加模式打开文件,它们可以直接写入文件而无需进一步锁定。
但是,如果任何进程以不同于附加的模式写入文件,则这将不再成立,并且您可能会看到损坏。
此外,一些网络文件系统(如 NFS 或必须融合的文件系统)可能无法保证此属性(但也可能不支持 flock)。不过 SMB/CIFS 在这里是安全的。
无论如何,在以追加模式打开文件时,无需查找到末尾,因为文件指针会自动设置为文件末尾。相反,查找可能会产生负面影响,因为它可能导致重叠写入(即:只要实际处理了查找,我不确定在追加模式下打开的文件是否可能。)
您可以使用超时。
如果获取锁需要超过 0.5 秒,这将引发 Timeout::Error 并显示给定的消息。