gpt4 book ai didi

ruby - 以原子方式读写文件

转载 作者:数据小太阳 更新时间:2023-10-29 07:33:51 24 4
gpt4 key购买 nike

我想在多个独立的 Ruby 进程(不是线程)之间以原子方式在 Ruby 中读写文件。

  • 我找到了 atomic_write来自 ActiveSupport。这将写入一个临时文件,然后将其移到原始文件上并设置所有权限。但是,这不会阻止文件在写入时被读取。
  • 我没有找到任何atomic_read。 (文件读取已经是原子的了吗?)

我是否需要实现我自己的单独“锁定”文件以在读取和写入之前进行检查?或者文件系统中是否已经存在更好的机制来将文件标记为“繁忙”,我可以在任何读/写之前检查?


动机是愚蠢的,但包含在这里是因为你会问它。

我有一个网络应用程序使用 SinatraThin 提供服务它(出于自身原因)使用 JSON 文件作为“数据库”。对服务器的每个请求都会读取文件的最新版本,进行任何必要的更改,然后将更改写入文件。

如果我只运行一个服务器实例,这会很好。但是,我正在考虑让 Thin 的多个副本在 Apache 反向代理后面运行。这些是离散的 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

关于ruby - 以原子方式读写文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29704864/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com