Подтвердить что ты не робот

Каков наилучший способ чтения файлов в приложении на основе EventMachine?

Чтобы не блокировать реактор, я хотел бы читать файлы асинхронно, но я не нашел очевидного способа сделать это с помощью EventMachine. Я пробовал несколько разных подходов, но никто из них не чувствует себя хорошо:

  • Просто прочитайте файл, он заблокирует реактор, но что, черт возьми, это не так медленно (если это не большой файл, а затем он определенно есть).
  • Откройте файл для чтения и прочитайте кусок на каждом тике (но сколько нужно прочитать? и он заблокирует реактор, слишком мало, и чтение будет медленнее, чем необходимо).
  • EM.popen('cat some/file', FileReader) чувствует себя действительно странно, но работает лучше, чем альтернативы выше. В сочетании с LineAndTextProtocol он быстро читает строки.
  • EM.attach, но я не нашел примеров того, как его использовать, и единственное, что я нашел в списке рассылки, это то, что он устарел в пользу...
  • EM.watch, который не нашел примеров использования для чтения файлов.

Как вы читаете файлы в цикле реактора EventMachine?

4b9b3361

Ответ 1

EM.attach/watch не может использоваться в файлах, так как select/epoll в файловом дескрипторе на диске всегда будет доступен для чтения.

В конечном счете, это зависит от того, что вы пытаетесь сделать. Если это небольшой файл, просто File.read. Если он больше, вы можете читать небольшие куски с течением времени. Например, EM:: FileStreamer делает это для отправки большого файла по сети.

Другим распространенным случаем использования является хвост файла и чтение нового содержимого при его изменении. Это может быть достигнуто с помощью EM.watch_file: http://github.com/jordansissel/eventmachine-tail