Как лучше всего читать файлы в приложении на основе EventMachine? - PullRequest
12 голосов
/ 01 мая 2010

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

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

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

1 Ответ

6 голосов
/ 05 мая 2010

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

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

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

...