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