In order not to block the reactor I would like to read files asynchronously, but I've found no obvious way of doing it using EventMachine. I've tried a few different approaches, but none of them feels right:
EM.popen('cat some/file', FileReader)
feels really weird, but works better than the alternatives above. In combination with the LineAndTextProtocol
it reads lines pretty swiftly.EM.attach
, but I haven't found any examples of how to use it, and the only thing I've found on the mailing list is that it's deprecated in favour of…EM.watch
, which I've found no examples of how to use for reading files.How do you read files within a EventMachine reactor loop?
EM.attach/watch cannot be used on files, as select/epoll on a disk-based file descriptor will always return readable.
Ultimately, it depends on what you're trying to do. If it's a small file, just File.read it. If it is larger, you can read small chunks over time. For example, EM::FileStreamer does this to send large file over the network.
Another common use-case is to tail a file and read in new contents when it changes. This can be achieved using EM.watch_file: http://github.com/jordansissel/eventmachine-tail
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With