Каков наилучший способ чтения файлов в приложении на основе EventMachine?
Чтобы не блокировать реактор, я хотел бы читать файлы асинхронно, но я не нашел очевидного способа сделать это с помощью EventMachine. Я пробовал несколько разных подходов, но никто из них не чувствует себя хорошо:
- Просто прочитайте файл, он заблокирует реактор, но что, черт возьми, это не так медленно (если это не большой файл, а затем он определенно есть).
- Откройте файл для чтения и прочитайте кусок на каждом тике (но сколько нужно прочитать? и он заблокирует реактор, слишком мало, и чтение будет медленнее, чем необходимо).
-
EM.popen('cat some/file', FileReader)
чувствует себя действительно странно, но работает лучше, чем альтернативы выше. В сочетании с LineAndTextProtocol
он быстро читает строки.
-
EM.attach
, но я не нашел примеров того, как его использовать, и единственное, что я нашел в списке рассылки, это то, что он устарел в пользу...
-
EM.watch
, который не нашел примеров использования для чтения файлов.
Как вы читаете файлы в цикле реактора EventMachine?
Ответы
Ответ 1
EM.attach/watch не может использоваться в файлах, так как select/epoll в файловом дескрипторе на диске всегда будет доступен для чтения.
В конечном счете, это зависит от того, что вы пытаетесь сделать. Если это небольшой файл, просто File.read. Если он больше, вы можете читать небольшие куски с течением времени. Например, EM:: FileStreamer делает это для отправки большого файла по сети.
Другим распространенным случаем использования является хвост файла и чтение нового содержимого при его изменении. Это может быть достигнуто с помощью EM.watch_file: http://github.com/jordansissel/eventmachine-tail