12

リアクタをブロックしないために、ファイルを非同期で読み取りたいのですが、EventMachineを使用してそれを行う明確な方法が見つかりませんでした。私はいくつかの異なるアプローチを試しましたが、どれも正しいとは感じていません。

  • ファイルを読むだけで、リアクターがブロックされますが、それはそれほど遅くはありません(大きなファイルでない限り、間違いなくそうです)。
  • 読み取るためにファイルを開き、各ティックでチャンクを読み取ります(ただし、読み取る量が多すぎると、リアクターがブロックされ、少なすぎると、読み取りが必要以上に遅くなります)。
  • EM.popen('cat some/file', FileReader)本当に奇妙に感じますが、上記の選択肢よりもうまく機能します。それと組み合わせて、LineAndTextProtocolそれはかなり速く行を読みます。
  • EM.attach、しかし、私はそれを使用する方法の例を見つけていません、そして私がメーリングリストで見つけた唯一のことはそれが廃止されて…</li>を支持しているということです
  • EM.watch、ファイルの読み取りに使用する方法の例は見つかりませんでした。

EventMachineリアクターループ内のファイルをどのように読み取りますか?

4

1 に答える 1

6

ディスクベースのファイル記述子のselect/epollは常に読み取り可能を返すため、EM.attach/watchはファイルには使用できません。

最終的に、それはあなたが何をしようとしているのかに依存します。小さなファイルの場合は、File.readだけです。それが大きい場合は、時間の経過とともに小さなチャンクを読み取ることができます。たとえば、EM :: FileStreamerはこれを実行して、ネットワーク経由で大きなファイルを送信します。

もう1つの一般的な使用例は、ファイルを末尾に追加し、ファイルが変更されたときに新しいコンテンツを読み込むことです。これは、EM.watch_fileを使用して実現できます:http://github.com/jordansissel/eventmachine-tail

于 2010-05-04T20:33:00.727 に答える