Tengo una unidad de red (Z: \) compartida por varias computadoras con Windows. ¿Es posible implementar un bloqueo entre máquinas simplemente creando/eliminando archivos en esta unidad de red?Implementación de bloqueo distribuido usando archivos
Por ejemplo, dos computadoras, A y B, desean escribir en un recurso compartido con una ID de 123 al mismo tiempo.
Una de las computadoras, por ejemplo A, bloquea el recurso primero al crear un archivo vacío Z: \ locks \ 123. Cuando B ve que hay un archivo de bloqueo con el nombre "123", B sabe que el recurso 123 está siendo utilizado por otra persona, por lo que tiene que esperar a que Z: \ locks \ 123 sea eliminado por A antes de que pueda acceder al recurso.
Es como la sección crítica en multihilo, pero quiero hacerlo en varias máquinas.
Estoy tratando de implementar en Python. Esto es lo que ocurrió:
import os
import time
def lock_it(lock_id):
lock_path = "Z:\\locks\\" + lock_id
while os.path.exists(lock_path):
time.sleep(5) # wait for 5 seconds
# create the lock file
lock_file = open(lock_path, "w")
lock_file.close()
def unlock_it(lock_id):
# delete the lock file
lock_path = "Z:\\locks\\" + lock_id
if os.path.exists(lock_path):
os.remove(lock_path)
esto no funcionará porque podría haber más de un procesos de salir del estado de espera y crear el archivo de bloqueo al mismo tiempo.
De nuevo, la pregunta es: ¿Es posible implementar un mecanismo de bloqueo entre máquinas en un almacenamiento compartido?
¿Qué le parece agregar tiempo de espera? es decir, después de un período de tiempo, digamos 60 segundos, el bloqueo se libera automáticamente. Suponiendo que el tiempo de bloqueo no exceda este tiempo de espera. Puedo obtener el tiempo de bloqueo con time.time() - os.path.getctime ("Z: \ my_lock") para verificar si un bloqueo está vencido. – eliang