我想在多个独立的 Ruby 进程(不是线程)之间以原子方式在 Ruby 中读取和写入文件。
atomic_write从 ActiveSupport找到的。这将写入一个临时文件,然后将其移动到原始文件上并设置所有权限。但是,这不会阻止在写入文件时读取文件。atomic_read. (文件读取是否已经是原子的?)我是否需要在读取和写入之前实现我自己的单独“锁定”文件?或者文件系统中是否已经存在更好的机制来将文件标记为“忙碌”,我可以在任何读/写之前检查?
动机是愚蠢的,但包含在此处是因为您要询问它。
我有一个使用Sinatra并由Thin提供服务的 Web 应用程序,它(出于自身原因)使用 JSON 文件作为“数据库”。对服务器的每个请求都会读取文件的最新版本,进行任何必要的更改,并将更改写出到文件中。
如果我只有一个服务器实例在运行,那就没问题了。但是,我正在考虑在 Apache 反向代理后面运行多个 Thin 副本。这些是离散的 Ruby 进程,因此真正并行运行。
经过进一步思考,我意识到我真的想让读-处理-写的行为原子化。那时我意识到这基本上迫使我一次只处理一个请求,因此没有理由运行多个实例。但是对于原子读取以及在写入过程中防止读取的好奇心仍然存在。因此这个问题。
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2232 次 |
| 最近记录: |