12

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

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

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

4

1 回答 1

6

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

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

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

于 2010-05-04T20:33:00.727 回答