При развертывании Rails через Passenger или Mongrel у вас есть несколько экземпляров запущенного приложения. Какова наилучшая практика или шаблон для создания мьютекса на общих ресурсах, таких как запись в локальный файл или удаленный файл. Я хочу, чтобы два процесса не записывались на один и тот же ресурс одновременно.Mutex for Rails Processes
ответ
Если вам просто нужно, чтобы предотвратить появление нескольких авторов от работы с файлом одновременно, вы можете использовать метод 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
является важным для предотвращения взаимоблокировки, если после того, как вы заблокировали файл, вы выбрали неперехваченное исключение.
Насколько я знаю, единственный способ сделать это в такой среде - использовать семафор на основе файлов - коснуться файла блокировки, выполнить свою работу, удалить файл блокировки. Сделайте процесс неудачным, если в файле есть блокировка.
У вас также может быть служба, которая записывает в файл с потоковой передачей, а приложения обращаются к службе, чтобы изменить файл, а не позволять им напрямую изменять файл.
Вы можете использовать планировщик фоновых заданий для выполнения фактической работы, например delayed_job (http://github.com/tobi/delayed_job).
- 1. Erlang Processes Reduction count
- 2. twisted Using Processes
- 3. Twilio Processes '&' as "And '
- 4. Javascript Game Thourght Processes
- 5. PerformanceCounter multiple Processes
- 6. Java Multi-Threaded Processes
- 7. fopen two processes
- 8. Threads and Processes
- 9. JQuery Processes timeline
- 10. Oracle Threads and Processes
- 11. Forked Processes Execute Sleeping
- 12. Замки для блокировки Mutex
- 13. R Shiny Queue of Processes
- 14. Golang: Child Processes становятся зомби
- 15. Killing Long Running Fastcgi Processes
- 16. NHibernate SQL Server Suspended Processes
- 17. C# Forms Inactive/Threading Processes
- 18. Threads vs Processes in Linux
- 19. Освобождение Mutex
- 20. Netbeans Intellisense for Rails
- 21. Приложение Lint for Rails
- 22. Mailgun for Rails Приложение
- 23. flexpaper for rails
- 24. Rails: Check for cookie
- 25. Best Permalinking for Rails
- 26. Tarantula for rails app
- 27. Markdown gem for Rails
- 28. regexp for rails logs
- 29. Rails Scoping for Existence
- 30. MongoDB for Rails
Отличное объяснение. –
Как проверить, заблокирован ли файл? Я хочу использовать файл как глобальную блокировку, #flock кажется прекрасным, но другой процесс должен проверить, доступен ли он, как мне это разрешить? –
@HarisKrajina, файл заблокирован, если 'flock (Файл :: LOCK_EX | File :: LOCK_NB)' возвращает 'false'. Документы см. В разделе «ri File.flock». –