【问题标题】:What is the best way to read files in an EventMachine-based app?在基于 EventMachine 的应用程序中读取文件的最佳方式是什么?
【发布时间】:2010-05-01 09:59:31
【问题描述】:

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

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

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

【问题讨论】:

    标签: ruby asynchronous eventmachine


    【解决方案1】:

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

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

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

    【讨论】:

    • 基本上我想并行读取几个中等大小的文件(最大 10 Mb)并提取每行的一部分。
    • 如果您需要执行的操作是逐行的,那么在每个刻度上读取文件的一行似乎是最有意义的。您将受益于 Ruby 的所有基于行的 IO 方法,您的事件块将最接近地反映您的业务逻辑,并且在每个块中做的更少仅仅意味着滴答声会发生得更快。
    • 在每个刻度上读取一行太慢了,因为我在反应器内花费时间等待 IO,这就是我想要避免的,我想在等待时做其他事情(比如处理行)用于 IO。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 2010-09-30
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    相关资源
    最近更新 更多