2015-10-29 2 views
9

История:
Несколько дней назад я думал о межпроцессной коммуникации на основе обмена файлами. Скажем, процесс A создает несколько файлов во время его работы, и процесс B читает эти файлы впоследствии. Чтобы гарантировать правильность написания всех файлов, было бы удобно создать специальный файл, существование которого будет сигнализировать о том, что все операции были выполнены.Обмен файлами между процессами: эффективность и условия гонки

Простой рабочий процесс:
процесс А создает файл «FILE1.TXT»
процесс А создает файл «file2.txt»
процесс А создает файл «processA.ready»

Процесс B не ждет, пока файл появляется «processA.ready», а затем читает файлы file1 и file2.

Сомнения:
Файловые операции выполняются в операционной системе, в частности подсистемой файла. Поскольку реализации могут отличаться в Unix, Windows или MacOS, я не уверен в надежности обмена данными между процессами обмена файлами. Даже если ОС будет гарантировать эту согласованность, в Java есть такие вещи, как JIT-компилятор, который может изменять порядок команд программы.

Вопросы:
1. Существуют ли какие-либо реальные характеристики на файловых операций в операционных системах?
2. Действительно ли JIT разрешено переупорядочить инструкции программы работы с файлами для одного потока программ?
3. Является ли обмен файлами по-прежнему актуальным вариантом для межпроцессного взаимодействия в настоящее время или безоговорочно лучше выбрать TCP/HTTP/etc?

+0

большая проблема у вас будет это кэширование дисковых операций. – user3344003

+1

Если бы я был вами, я бы использовал HTTP. Нет необходимости синхронизировать процессы и писать какие-то прослушиватели событий. И будет легче разделить эти процессы на разные машины в будущем. – gkiko

+0

@ gkiko на самом деле я уже сделал это :) – AdamSkywalker

ответ

2
  1. Вы можете использовать Наблюдатель файлов (WatchService) на Java, чтобы получить сигнал, когда появится ваш файл .ready.

  2. Реорганизация может применяться, но это не должно повредить логику приложения в этом случае - обратитесь по следующей ссылке: https://assylias.wordpress.com/2013/02/01/java-memory-model-and-reordering/

  3. я не знаю размер ваших данных, но я чувствую, что все еще будет лучше использовать решение очереди сообщений (MQ) в этом случае. Использование файла IO - относительно медленная операция, которая может замедлить работу системы.

1

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

  1. процесс FTP загружает файл и поместить его имя «.downloaded»
  2. Главный процессор задача искал каталог для файлов „* .downloaded“.
    Перед запуском задание обновляет имя файла как «.processing».
    По завершении обновляется до «.done».
    В случае ошибки он создает новый файл дополнений с расширением '.error' и помещает последнюю обработанную строку и трассировку исключения там. При повторных попытках, если этот файл существует, прочитайте его и вернитесь с правильной позиции.
  3. Процесс поиска выполняет поиск.done "и в соответствии с его конфигурацией переместить в резервную папку или удалить

Этот подход работает отлично с огромной нагрузкой в ​​сети оператора мобильной связи.

Рассмотрение вопроса является с использованием уникальных имен для файлов. Поскольку поведение движущегося файла изменяется в соответствии с операционной системой.
, например. Windows дает ошибку, когда есть тот же файл в пункте назначения, однако unix ovrwrites.

3
  1. В этом случае вам не нужно знать информацию о ОС. API Java IO документирован, чтобы угадать, был ли файл сохранен или нет.
  2. JVM не может изменять порядок внутренних вызовов. Он явно не написан в JMM, но подразумевается, что он не может этого сделать. JVM не может догадаться, какое влияние нативный вызов и переупорядочение этих вызовов могут быть довольно щедрыми.
  3. Есть некоторые недостатки использования файлов как способ коммуникации:
    1. Он использует IO, который медленно
    2. трудно отделить процессы между различными машинами в случае, если вы должны были бы его (есть способы с использованием самба, например, но вполне зависит от платформы)
Смежные вопросы