【发布时间】:2015-04-17 16:36:57
【问题描述】:
我想在 Ruby 中在多个独立的 Ruby 进程(不是线程)之间以原子方式读取和写入文件。
- 我从 ActiveSupport 找到了
atomic_write。这将写入一个临时文件,然后将其移至原始文件并设置所有权限。但是,这不会阻止文件在写入时被读取。 - 我没有找到任何
atomic_read。 (文件读取是否已经原子化?)
我是否需要实现我自己的单独“锁定”文件,以便在读写之前检查?或者文件系统中是否已经存在更好的机制来将文件标记为“忙碌”,我可以在任何读/写之前检查它?
动机是愚蠢的,但在这里包括因为你要问它。
我有一个使用 Sinatra 并由 Thin 提供服务的 Web 应用程序,它(出于自身原因)使用 JSON 文件作为“数据库”。对服务器的每个请求都会读取文件的最新版本,进行必要的更改,然后将更改写入文件。
如果我只有一个服务器实例正在运行,那就没问题了。但是,我正在考虑在 Apache 反向代理后面运行多个 Thin 副本。这些是离散的 Ruby 进程,因此真正并行运行。
经过进一步思考,我意识到我真的想让读-处理-写的行为原子化。此时我意识到这基本上迫使我一次只处理一个请求,因此没有理由运行多个实例。但是关于原子读取以及在写入期间防止读取的好奇心仍然存在。因此问题。
【问题讨论】:
-
检查然后采取行动(与锁定文件一样)容易出现竞争条件。您不想将两者分开。