在基于EventMachine的应用程序中读取文件的最佳方法是什么?

The*_*heo 12 ruby asynchronous eventmachine

为了不阻塞反应器,我想异步读取文件,但我发现使用EventMachine没有明显的方法.我尝试了几种不同的方法,但没有一种感觉正确:

  • 只是阅读文件,它会阻止反应堆,但到底是什么,它不是那么慢(除非它是一个大文件,然后它肯定是).
  • 打开文件进行读取,并在每个刻度线上读取一个块(但读取多少?太多,它会阻塞反应堆,太少,读取速度会慢于必要).
  • EM.popen('cat some/file', FileReader)感觉真的很奇怪,但比上面的替代品更好.与LineAndTextProtocol它结合使用它可以很快地读取线条.
  • EM.attach,但我还没有找到任何如何使用它的例子,我在邮件列表上发现的唯一一件事就是它被弃用了...
  • EM.watch,我没有找到如何用于阅读文件的例子.

如何读取EventMachine反应器循环中的文件?

tmm*_*mm1 6

EM.attach/watch不能用于文件,因为基于磁盘的文件描述符上的select/epoll将始终返回可读性.

最终,这取决于你想要做什么.如果它是一个小文件,只需File.read它.如果它更大,你可以随着时间的推移阅读小块.例如,EM :: FileStreamer执行此操作以通过网络发送大文件.

另一个常见的用例是在文件发生变化时拖尾文件并读入新内容.这可以使用EM.watch_file来实现:http://github.com/jordansissel/eventmachine-tail