Possiedo un'unità di rete (Z: \) condivisa da più computer Windows. È possibile implementare un blocco cross-machine semplicemente creando/eliminando file su questa unità di rete?Implementazione del blocco distribuito utilizzando i file
Ad esempio, due computer, A e B, desiderano scrivere su una risorsa condivisa con un ID di 123 allo stesso tempo.
Uno dei computer, ad esempio A, blocca prima la risorsa creando un file vuoto Z: \ locks \ 123. Quando B vede che c'è il file di lock con il nome di "123", B sa che la risorsa 123 viene utilizzata da qualcun altro, quindi deve aspettare che Z: \ locks \ 123 sia cancellato da A prima che possa accedere al risorsa.
È come una sezione critica nel multithreading, ma voglio farlo su più macchine.
Sto provando a implementare in Python. Ecco quello che mi si avvicinò con:
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)
questo non funzionerà, perché ci potrebbero essere più di uno dei processi uscire dallo stato di attesa e creare il file di blocco, allo stesso tempo.
Quindi, ancora una volta, la domanda è: È possibile implementare un meccanismo di blocco incrociato su una memoria condivisa?
Come aggiungere un timeout? Ad esempio, dopo un periodo di tempo, diciamo 60 secondi, il blocco viene rilasciato automaticamente. Supponendo che il tempo di blocco non superi questo timeout. Posso ottenere il tempo di blocco con time.time() - os.path.getctime ("Z: \ my_lock") per verificare se un blocco è in ritardo. – eliang