2009-09-22 10 views
5

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

14

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.

+1

Excelente explicación. –

+1

¿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? –

+0

@HarisKrajina, un archivo está bloqueado si 'flock (File :: LOCK_EX | File :: LOCK_NB)' devuelve 'false'. Para documentos, consulte 'ri File.flock'. –

2

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.