• Publicidad

Alternativas al uso de tie

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Alternativas al uso de tie

Notapor thiseyramo » 2009-06-24 10:04 @461

Hola a todos, tengo un pequeño problema con el uso de tie()... Resulta que necesito que dos procesos diferentes accedan al mismo tiempo a ficheros de serialización que se han creado con tie(), pero buscando en Internet me encontré con que esto no es posible...

Lo que quisiera saber es si existe otro módulo que haga lo mismo que tie(), pero que sí me permita acceso simultáneo al fichero. O que al menos en determinado momento me permita "clonar" o copiar ese fichero en otra ubicación para que otro proceso lo pueda usar sin que el actual deje de funcionar en ningún momento.

Les agradezco de antemano cualquier colaboración...

Saludos
thiseyramo
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2009-06-24 10:00 @458
Ubicación: Bucaramanga, Colombia

Publicidad

Notapor explorer » 2009-06-24 11:27 @518

Bienvenido a los foros de Perl en Español, thiseyramo.

¿No te funciona lo comentado en el apartado flock() del módulo Tie::File?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor thiseyramo » 2009-06-24 11:40 @528

Hola, gracias por responder tan pronto...

¿Lo que me sugieres entonces es bloquear el fichero mientras hago la copia a la otra ubicación?

No la veo muy clara... disculpa mi ignorancia, pero es que soy realmente nuevo con Perl...

Saludos
thiseyramo
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2009-06-24 10:00 @458
Ubicación: Bucaramanga, Colombia

Notapor explorer » 2009-06-24 14:18 @637

Según la documentación, sirve para eso.

Quizás otra opción sea usar un sistema de base de datos, en lugar de tie(). Pero yo probaría con el flock(), claro, por ver si con eso me vale.

Como pone en la documentación, hay que hacer los tie(), flock() y untie() de forma rápida, para dar oportunidad al resto de procesos el que puedan acceder al fichero.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor explorer » 2009-06-24 14:22 @640

Un momento... acabo de darme cuenta de un detalle...

Estás hablando de copiar el fichero entero a otro sitio...

A ver... si adoptas la política de que no te importa que otro proceso esté leyendo el fichero mientras lo estás moviendo, eso es factible hacerlo en sistema Unix/Linux. Si estás en Windows, sí que tienes un problema.

Una opción sería: cámbiale de nombre al principio, para que el resto de procesos, si intentan leerlo, no lo puedan encontrar. Haces luego el proceso de movimiento.

Humm... quizás hacen falta más detalles de lo que quieres hacer...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor thiseyramo » 2009-06-24 15:09 @673

Bueno, te comento... lo que tengo es lo siguiente... 2 máquinas que acceden a un medio físico compartido, específicamente un NAS.

Inicialmente cada máquina escribe su serialización en un directorio aparte dentro de ese medio compartido, digamos: Serialize1 y Serialize2 correspondientemente; hasta ahí no hay problema.

Atendiendo peticiones solo va a estar una máquina a la vez y ya tenemos resuelto el tema de que esas dos serializaciones se sincronicen; mi problema empieza cuando una de las dos máquinas falla, momento en el cual no tengo manera de mantener actualizada su serialización en relación con la de la máquina que sigue viva, de manera que en el momento en que esta máquina que falló vuelva a entrar en servicio no tendrá la serialización correcta. Por eso había pensado en copiar la serialización que está actualizada a la otra máquina para que las dos queden con los datos correctos.

El tie() se está empleando de la siguiente manera:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
tie(%hash, "DB_file", 'archivo.db', O_CREAT|O_RDWR, 0755)
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Espero que con eso se puedan hacer mejor a una idea de mi problemita..

Saludos,
thiseyramo
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2009-06-24 10:00 @458
Ubicación: Bucaramanga, Colombia

Notapor explorer » 2009-06-24 17:56 @789

¿Y el programa, al arrancar, no puede darse cuenta de que está su correspondiente fichero desincronizado y hacer en ese momento una copia?

Mirando las fechas de los ficheros, se podría hacer... y con flock() te aseguras que no es actualizado el fichero mientras es copiado. Lo que no sé es si funcionará en un sistema de ficheros remoto (porque supongo que los programas se ejecutan en el entorno local de cada máquina).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor thiseyramo » 2009-06-25 08:52 @411

Correcto; cada programa se ejecuta en el entorno local de su máquina... pero creo que la opción que me dices puede servir, tendría que enviarle un comando a la máquina que está con vida para que haga al flock() mientras se hace la copia.

Voy a hacer un par de pruebas y luego comento los resultados...

Saludos.
thiseyramo
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2009-06-24 10:00 @458
Ubicación: Bucaramanga, Colombia

Notapor explorer » 2009-06-25 09:01 @417

Humm... más bien el flock() debería hacerlo el fichero que necesita obtener la última copia... para evitar que el que estaba vivo lo modifique mientras.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Jenda » 2009-06-27 07:39 @361

tie() no tiene nada que ver con ficheros. Lo único que tie() hace es atar un hash con algún objeto. Y es el objeto que escribe en ficheros o bases de datos o computa algo o ...

Así que sin saber a qué clase tie() el hash, no podemos ayudar con nada. Ahora, cuando sabemos que es DB_File podemos aconsejarte a leer la documentación del DB_File. Especialmente las secciones "Locking: The Trouble with fd" y "Safe ways to lock a database".

Parece que debes usar BerkeleyDB en vez de DB_File. Ver su documentación.
-------------------------------------------------------
- Estoy aquí para practicar español. Si te ayudó mi respuesta ayudame con un mensaje privado sobre mis faltas por favor. Seguramente habrá muchas :-)
Jenda
Perlero nuevo
Perlero nuevo
 
Mensajes: 132
Registrado: 2007-10-29 06:31 @313
Ubicación: Praga, Republica Checa

Siguiente

Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados