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

时间:2010-05-01 09:59:31

标签: ruby asynchronous eventmachine

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

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

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

1 个答案:

答案 0 :(得分:6)

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

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

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

来实现