Al desplegar raíles a través de Passenger o Mongrel tiene varias instancias de la aplicación ejecutándose. ¿Cuál es la mejor práctica o patrón para establecer un mutex en recursos compartidos, como escribir en un archivo local o en un archivo remoto? Quiero asegurarme de que dos procesos no estén escribiendo en el mismo recurso al mismo tiempo.Mutex para procesos de rieles
Respuesta
Si sólo tiene que evitar que varios escritores de trabajar con un archivo al mismo tiempo, puede utilizar el método File#flock
para solicitar un bloqueo de escritura exclusiva de cada proceso:
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
Nota: poner la llamada de desbloqueo en una ensure
bloque es importante para evitar un interbloqueo si se produce una excepción no detectada después de haber bloqueado el archivo.
Hasta donde yo sé, la única manera de hacerlo en un entorno como este es utilizar un semáforo basado en archivos: toque un archivo de bloqueo, haga su trabajo, elimine el archivo de bloqueo. Haga que el proceso falle si hay un bloqueo en el archivo.
También podría tener un servicio que escriba en el archivo enhebrado y hacer que las aplicaciones hablen con el servicio para modificar el archivo en lugar de dejar que modifiquen el archivo directamente.
Puede usar un planificador de trabajos en segundo plano para realizar el trabajo real, por ejemplo, demora_trabajo (http://github.com/tobi/delayed_job).
- 1. Sincronización de 2 procesos usando objetos de sincronizaciones entre procesos - Mutex o AutoResetEvent
- 2. ¿Mutex o no a Mutex?
- 3. ¿Necesito un mutex para leer?
- 4. boost interprocess mutex vs boost hilo mutex
- 5. recursiva de bloqueo (mutex) vs Bloqueo no recursiva (mutex)
- 6. Diferencia entre bloqueos, mutex y secciones críticas
- 7. ¿Pruebas unitarias para procesos estocásticos?
- 8. Patrones para procesos múltiples PHP?
- 9. objeto mutex llamado
- 10. Uso de muchos bloqueos mutex
- 11. ¿Debo eliminar un Mutex?
- 12. Boost, concepto mutex
- 13. abandonado mutex excepción
- 14. cross-user C# mutex
- 15. "Manejo seguro" de un Mutex?
- 16. Android NDK Mutex
- 17. Cuándo usar mutex recursivo?
- 18. Exclusión mutua PHP (mutex)
- 19. ¿Obtener una lista de mutex?
- 20. usando Kernel # tenedor para procesos de fondo, pros? ¿contras?
- 21. WPF mutex para instancia de aplicación única que no funciona
- 22. Implementación personalizada de RAII C++ para bloqueos mutex con ámbito
- 23. ¿Hay alguna herramienta para supervisar objetos de sincronización (mutex, eventos, semáforos) en Windows?
- 24. Procesos Zombie que aparecen cuando genero procesos
- 25. ¿Cómo medir la contención mutex?
- 26. boost mutex C++/CLI problems
- 27. ¿Usar un mutex como semáforo?
- 28. Leer escribir mutex en C++
- 29. Bloqueo Mutex: ¿qué significa "bloqueo"?
- 30. ¿Cómo puedo crear un Mutex del sistema en C#
Excelente explicación. –
¿Cómo verificamos si el archivo está bloqueado? Quiero usar el archivo como un bloqueo global, #flock me parece bien, pero otro proceso necesita verificar si está disponible, ¿cómo lo resuelvo? –
@HarisKrajina, un archivo está bloqueado si 'flock (File :: LOCK_EX | File :: LOCK_NB)' devuelve 'false'. Para documentos, consulte 'ri File.flock'. –