Как позволить людям и программам получать доступ к одному и тому же файлу, не наступая друг другу на пальцы - PullRequest
2 голосов
/ 17 февраля 2009

Предположим, у меня есть файл urls.txt, который содержит список URL-адресов, которые я отслеживаю. Мой скрипт мониторинга иногда редактирует этот файл, например, чтобы указать, доступен ли каждый URL. Я также хотел бы вручную отредактировать этот файл, добавить или изменить список URL-адресов. Как я могу сделать так, чтобы мне не приходилось думать об этом при ручном редактировании?

Вот несколько возможных ответов. Что бы вы сделали?

  1. Занимайтесь хакерством, например, проверкой программы на наличие файлов блокировки, создаваемых vim или emacs. Поскольку это только для меня, это действительно сработает.

    • Если правки человека всегда имеют приоритет, просто всегда имейте в виду изменения программы (например, игнорируйте предупреждение редактора об изменении файла на диске). Затем программа может просто повторить свои изменения в следующем цикле. Тем не менее, изменять файл, пока пользователь редактирует его, не так приятно.

    • Никогда не позволяйте человеку трогать файл, в который программа вносит постоянные изменения. Переосмыслите дизайн и получите один файл, который редактирует только человек, и другой файл, который редактирует только программа.

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

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

(Обратите внимание, что я придумал пример мониторинга URL, чтобы сделать это более конкретным, и потому, что я на самом деле имею в виду, возможно, слишком странный и отвлекающий - этот вопрос строго о том, как позволить людям и программам изменять один и тот же файл состояния .)

Ответы [ 4 ]

6 голосов
/ 17 февраля 2009

Я бы использовал базу данных, потому что это в основном то, что вам нужно построить, чтобы достичь того, чего вы хотите. Зачем заново изобретать колесо?

Если полноценная СУБД слишком загружена, разделите файлы на две части и периодически синхронизируйте их. Доступность URL-адреса не похожа на то, что пользователь будет изменять, поэтому он не должен редактироваться им.

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

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

2 голосов
/ 17 февраля 2009

Используйте разумную систему контроля версий!

(Git будет хорошо работать здесь).

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

1 голос
/ 17 февраля 2009

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

0 голосов
/ 17 февраля 2009

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

...