我想在多个独立的Ruby进程(而不是线程)之间以原子方式读取和写入一个文件。
atomic_write
。这将写入临时文件,然后将其移动到原始文件并设置所有权限。但是,这不会阻止在写入文件时读取文件。atomic_read
。 (文件读取是否已原子化?)我是否需要在读取和写入之前实现我自己检查的单独“锁定”文件?或者文件系统中是否存在一种更好的机制,用于将文件标记为“忙”,我可以在任何读/写之前检查它?
动机很愚蠢,但包括在这里是因为你会问这个问题。
我有一个使用Sinatra并由Thin提供服务的Web应用程序(由于其自身原因)使用JSON文件作为“数据库”。每个服务器请求都会读取文件的最新版本,进行必要的更改,并将更改写入文件。
如果我只运行一个服务器实例,那就没问题。但是,我正在考虑在Apache反向代理后面运行Thin的多个副本。这些是离散的Ruby进程,因此真正并行运行。
经过进一步的反思,我意识到我真的想做一个read-process-write atomic的行为。此时我意识到这基本上迫使我一次只处理一个请求,因此没有理由让多个实例运行。但是,关于原子读取和在写入过程中阻止读取的好奇心仍然存在。因此问题。
答案 0 :(得分:2)
您想在独占模式下使用File#flock
。这是一个小小的演示。在两个不同的终端窗口中运行它。
filename = 'test.txt'
File.open(filename, File::RDWR) do |file|
file.flock(File::LOCK_EX)
puts "content: #{file.read}"
puts 'doing some heavy-lifting now'
sleep(10)
end
答案 1 :(得分:1)
看看“ pstore.rb”(Ruby stdlib)中的transaction
和open_and_lock_file
方法。
YAML::Store
对我来说很好。因此,当我需要自动进行读/写操作时,我(ab)使用它将数据存储为Hash
。