Есть ли способ синхронизировать запись в файл среди разных процессов (не потоков)

Мой проект требует запуска на нескольких разных физических машинах, которые имеют общую файловую систему. В связи с этим возникает одна проблема: как синхронизировать запись в один общий файл? С потоками, что может быть легко достигнуто с помощью блокировок, однако моя программа состоит из процессов, распределенных на разных машинах, которые я понятия не имею, как синхронизировать. Теоретически, любой способ проверить, открывается ли файл прямо сейчас или какие-либо подобные блокировки решения, подойдет, но я просто не могу взломать это сам. Способ Python будет особенно цениться.

2 ответа

Есть механизм блокировки файлов для нескольких процессов, даже написанных на нескольких языках. Для этого используются специальные механизмы блокировки операционной системы. Языки Java JNI, C++ и т. Д. Реализовали эти механизмы блокировки для синхронизации доступа к файлам в нескольких процессах ОС [внутри LT-облегченных потоков].

Посмотрите для вашего языка родных механизмов синхронизации файлов для этого.

Ниже приведен пример на основе Java:

FileInputStream in = new FileInputStream(file);
try {
    java.nio.channels.FileLock lock = in.getChannel().lock();
    try {
        Reader reader = new InputStreamReader(in, charset);
        ...
    } finally {
        lock.release();
    }
} finally {
    in.close();
}

Эта блокировка должна быть независимой от ОС [работать в Unix, таких как системы, Windows и т. Д.].

Для подобных сценариев я предлагаю использовать двойную блокировку для лучшего контроля доступа.

Просто мысль...

Не могли бы вы поместить файл блокировки в тот же каталог, где находится файл, в который вы пытаетесь записать? В ваших распределенных процессах проверьте этот файл блокировки. Если оно существует, спите на сумму x и попробуйте снова. Точно так же, когда процесс, у которого в данный момент открыт файл, завершает процесс, удаляет файл блокировки?

Итак, если у вас в простом случае 2 процесса, называемые A и B:

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

Если процесс A обнаруживает файл блокировки, то это означает, что процесс B имеет этот файл, так что поспите и повторите попытку позже... повторите промывку.

Другие вопросы по тегам