Я хотел бы читать и записывать файл атомарно в Ruby между несколькими независимыми процессами Ruby (а не потоками).Чтение и запись файла атомарно
- Я нашел
atomic_write
от ActiveSupport. Это записывается в временный файл, затем перемещает его по оригиналу и устанавливает все разрешения. Однако это не мешает чтению файла во время его написания. - Я не нашел ни одного
atomic_read
. (Являются ли чтение файлов уже атомарным?)
Нужно ли мне реализовать собственный отдельный файл блокировки, который я проверяю перед чтением и записью? Или есть лучший механизм, уже присутствующий в файловой системе для того, чтобы пометить файл как «занятый», который я мог проверить перед любым чтением/записью?
Мотивация немой, но включен здесь, потому что вы собираетесь спросить об этом.
У меня есть веб-приложение, использующее Sinatra и обслуживается Thin, который (по его собственным причинам) использует файл JSON в качестве «базы данных». Каждый запрос на сервер считывает последнюю версию файла, вносит необходимые изменения и записывает изменения в файл.
Это было бы хорошо, если бы у меня был только один экземпляр сервера. Тем не менее, я думал о том, что несколько экземпляров Thin работают за обратным прокси-сервером Apache. Это отдельные процессы Ruby и, таким образом, работают по-настоящему параллельно.
При дальнейших размышлениях я понимаю, что я действительно хочу совершить акт чтения-процесса-записи атома. В этот момент я понимаю, что это в основном заставляет меня обрабатывать только один запрос за раз, и, следовательно, нет причин для запуска нескольких экземпляров. Но любопытство в отношении атомных чтений и предотвращение чтения во время записи остается. Отсюда вопрос.
Проверка, а затем действие (как в файле блокировки) подвержено условиям гонки. Вы не хотите отделять их. –