1

ストリーミング イベント マシン サーバーを作成しています。IO のブロックを回避することや、イベント ループを台無しにするために何か他のことを行うことを懸念しています。

私が読んだところによると、Ruby のノンブロッキング IO を使用してファイルをノンブロッキングでストリーミングするか、next_tick を呼び出すことができますが、これらのアプローチのどちらが望ましいかは少しわかりません。

問題の一部は、Ruby のノンブロッキング IO ライブラリ関数の適切な説明を見つけられなかったことです。

短いバージョン: 長時間のネットワーク IO 操作、ファイルごとの数時間のストリーミング、転送を想定すると、イベント ループを台無しにすることなく eventmachine でこれを行う最善の方法は何ですか?

  while 1 do
    file.read do |bytes|
      @conn.send_data bytes
    end
  end

上記のコードがブロックされることは理解していますが、その場所に何を配置すればよいか迷っています。また、eventmachine の一部である FileStreamer クラスをそのまま使用することはできません。読み取り後、送信前にデータを操作する必要があるためです。

4

1 に答える 1

1

FileStreamer は引き続き使用できると思います。FileStreamer は最初の引数が Connection であることを想定していますが、これは緩い契約です。FileStreamer が期待するメソッドを実装している限り、動作するはずです。これを見てください

https://gist.github.com/f4d997c3eeb6bdc5a9f3

処理する必要があるメソッドはsend_datasend_file_dataです。ここで操作を実行できます。次に、結果を EM::Connection に渡します。

また、コードを読んだところによると、FileStreamer の特別な特性は、メモリ マップされたファイルを割り当てることです (ファイルが小さい場合を除きます)。通常の Ruby ファイルを開き、そこからブロックを読み取り、操作を行い、FileStreamer.stream_one_chunk. 基本的には次のとおりです。

  • 各反復は、何らかのデータを接続に送信するか、使用してそれ自体を再スケジュールする必要がありますnext_tick
  • アウトバウンド バッファがいっぱいになるまで、データを Connection に繰り返し書き込むことができます ( に従ってget_outbound_data_size) 。
  • ファイルが完全に読み取られたら、ファイルを閉じる必要があります (もちろん)

実際、ファイルがメモリに快適に収まらない限り、FileStreamer を使用しない方がよいように思えます。

データがストリーミングされているときにデータを変換する方法については、EM::Protocols を参照してください。

于 2012-01-06T02:31:17.110 に答える