Мьютекс для рельсовых процессов - PullRequest
5 голосов
/ 22 сентября 2009

При развертывании Rails через Passenger или Mongrel у вас работает несколько экземпляров приложения. Какова лучшая практика или шаблон для установки взаимного исключения на общих ресурсах, таких как запись в локальный файл или в удаленный файл. Я хочу убедиться, что два процесса не пишут в один и тот же ресурс одновременно.

Ответы [ 3 ]

14 голосов
/ 22 сентября 2009

Если вам просто нужно предотвратить одновременную работу с файлом нескольких писателей, вы можете использовать метод File#flock для запроса исключительной блокировки записи у каждого процесса:

fh = File.new("/some/file/path")
begin
  fh.flock(File::LOCK_EX)
  # ... write to the file here, or perform some other critical operation
ensure
  fh.flock(File::LOCK_UN)
end

Примечание. Помещение вызова разблокировки в блок ensure важно для предотвращения тупиковой ситуации, если после блокировки файла выдается необработанное исключение.

2 голосов
/ 22 сентября 2009

Вы можете использовать планировщик фоновых заданий для выполнения фактической работы, например delayed_job (http://github.com/tobi/delayed_job).

2 голосов
/ 22 сентября 2009

Насколько я знаю, единственный способ сделать это в такой среде - использовать семафор на основе файлов - коснуться файла блокировки, выполнить свою работу, удалить файл блокировки. Сделайте процесс неудачным, если файл заблокирован.

У вас также может быть служба, которая записывает в файл с многопоточностью и заставляет приложения взаимодействовать со службой, чтобы изменить файл, а не позволять им изменять файл напрямую.

...