Внедрение распределенной блокировки с помощью файлов

У меня есть сетевой диск (Z:\), который используется несколькими компьютерами Windows. Можно ли реализовать межмашинную блокировку, просто создав/удалив файлы на этом сетевом диске?

Например, два компьютера, A и B, хотят одновременно выполнить запись в общий ресурс с идентификатором 123.

Один из компьютеров, скажем A, сначала блокирует ресурс, создавая пустой файл Z:\locks\123. Когда B видит, что есть файл блокировки с именем «123», B знает, что ресурс 123 используется кем-то другим, поэтому он должен ждать, пока Z:\locks\123 не будет удален A, прежде чем он сможет получить доступ к файлу. ресурс.

Это похоже на критическую секцию в многопоточности, но я хочу сделать это на нескольких машинах.

Пытаюсь реализовать на Python. Вот что я придумал:

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)

Это не сработает, потому что может быть более одного процесса, выходящего из состояния ожидания и одновременно создающего файл блокировки.

Итак, еще раз, вопрос : возможно ли реализовать механизм межмашинной блокировки на общем хранилище?

10
задан eliang 6 June 2012 в 04:13
поделиться