加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 原子读写文件

发布时间:2020-12-17 02:23:54 所属栏目:百科 来源:网络整理
导读:我想在多个独立的 Ruby进程(而不是线程)之间以原子方式读取和编写一个文件. 我从ActiveSupport找到了 atomic_write .这将写入临时文件,然后将其移动到原始文件并设置所有权限.但是,这不会阻止在写入文件时读取文件. 我还没有找到任何atomic_read. (文件读取
我想在多个独立的 Ruby进程(而不是线程)之间以原子方式读取和编写一个文件.

>我从ActiveSupport找到了atomic_write.这将写入临时文件,然后将其移动到原始文件并设置所有权限.但是,这不会阻止在写入文件时读取文件.
>我还没有找到任何atomic_read. (文件读取是否已原子化?)

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

动机是愚蠢的,但包括在这里是因为你会问这个问题.

我有一个使用Sinatra的Web应用程序,由Thin提供服务(由于其自身原因)使用JSON文件作为“数据库”.每个服务器请求都会读取文件的最新版本,进行必要的更改,并将更改写入文件.

如果我只运行一个服务器实例,那就没问题.但是,我正在考虑在Apache反向代理后面运行Thin的多个副本.这些是离散的Ruby进程,因此可以并行运行.

经过进一步的反思,我意识到我真的想做一个read-process-write atomic的行为.此时我意识到这基本上迫使我一次只处理一个请求,因此没有理由让多个实例运行.但是,关于原子读取和在写入过程中阻止读取的好奇心仍然存在.因此问题.

解决方法

您想在独占模式下使用 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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读