2010-11-09 60 views
1

我正在創建流式事件機服務器。我很擔心避免阻塞IO或者做其他事情來彌補事件循環。從EventMachine處理程序流式傳輸文件?

從我讀到的,ruby的非阻塞IO可以用於以非阻塞方式傳輸文件,或者我可以調用next_tick,但我有點不清楚這些方法哪一個更可取。

問題的一部分是,我沒有找到一個很好的解釋在紅寶石非阻塞IO庫函數。

短版: 假設一個長期的網絡IO操作,每個文件,流媒體傳輸的幾個掛鐘分鐘,什麼是做這EventMachine的不脫膠了事件循環的最佳方式?

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

我明白上面的代碼會阻塞,我不知道要放在什麼位置。另外,我不能使用作爲eventmachine一部分的FileStreamer類,因爲我需要在讀取數據之後但在發送數據之前操作數據。

+0

這裏也有類似的問題。 http://stackoverflow.com/questions/4645761/how-to-write-large-files-with-ruby-eventmachine – 2011-01-10 11:50:31

+0

我還沒有解決這個令我滿意,我對「最佳實踐」解決方案的興趣仍然很高。我的兩難處境是,我希望能夠在接近實時的情況下對流進行cpu密集型操作。不幸的是,這個答案可能是正確的http://stackoverflow.com/questions/4645761/how-to-write-large-files-with-ruby-eventmachine/4655193#4655193 – g33kz0r 2011-01-12 09:40:18

回答

1

我認爲你仍然可以使用FileStreamer。 FileStreamer期望它的第一個參數是一個Connection,但這是一個寬鬆的合同。只要你實現FileStreamer期望的方法,它就可以工作。看看這個

https://gist.github.com/f4d997c3eeb6bdc5a9f3

你需要處理的方法是send_datasend_file_data。你可以在這裏執行你的操作。然後將結果傳遞給EM :: Connection。另外,從我讀取的代碼中,FileStreamer的特殊屬性是它分配一個內存映射文件(除非文件很小)。你可以通過打開一個普通的Ruby文件,讀取它的塊,做你的操作,並模擬FileStreamer.stream_one_chunk的行爲來做基本相同的事情。這基本上是:

  • 每次迭代必須或者一些數據發送到所述連接,或使用重新安排本身next_tick
  • 數據可以重複寫入到連接到所述出站緩衝器滿(根據get_outbound_data_size
  • 一旦該文件已被充分閱讀,它應該(當然)

實際上是封閉的,在我看來,你有最好不要使用除非FileStreamer您文件將舒適地適合內存。

您可以查看EM :: Protocols,瞭解有關如何在數據流式傳輸時轉換數據的想法。