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

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

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

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

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

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

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