2016-06-04 1 views
3

У меня есть ситуации, когда мне нужно одновременно для чтения/записи из/в файл, но объем операций ограничен:Golang одновременное чтение/запись в файл без явного файла блокировки

  • Append только, никакое случайное смещение не записывает
  • читает из случайной позиции, где я точно знаю, что контент был написан ранее (через добавление, сериализация внутреннего доступа через канал golang для обеспечения случайного чтения происходит только после добавления содержимого)
  • только один процесс работает

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

Я собирался открыть 2 файла - один для чтения, другой для Append только

может ли это создать некоторые потенциальные проблемы/ошибки?

Какова рекомендуемая практика, если я хотел бы избежать блокировки файлов для каждого чтения/записи?

p.s. golang, linux, ext4

ответ

2

Я предполагаю, что «случайное чтение» на самом деле означает «произвольное чтение».

Если я правильно понимаю ваш случай использования, вам не нужно искать или блокировать или делать что-либо вручную. В UNIX это распространяется через O_APPEND. Вот что вы можете сделать:

  1. Открыть файл с os.O_APPEND. Таким образом, каждая запись, , независимо от любых предыдущих операций, перейдет в конец файла
  2. При чтении используется File.ReadAt. Это позволяет указать произвольные смещения для ваших чтений.

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

+0

Вы уверены, что нет никаких шансов на повреждение данных? чтение может происходить параллельно с добавлениями, единственная гарантия, которую я имею, - это то, что чтение всегда выполняется для ранее добавленных данных (в другой версии goroutine) - это обеспечивается с помощью «правильного» смещения для чтения. Есть ли официальная документация, которую вы можете связать? – let4be