2009-08-28 43 views
0

我需要2個(或者3個)連續運行Ruby中程序的「方面」 - 一個通信線程,一個呈現線程和一個緩存線程。線程或DRb?

想法是呈現線程顯示幻燈片放映(其定義從文件中讀取)並且通信線程從遠程HTTP服務器檢索所有幻燈片。渲染必須是連續的,沒有停止(因此可能需要緩存)。該文件可能會在程序生命週期中發生變化,因此需要重新解析(即時)。

我想在「方面」之間發送消息,例如當通信線程獲取整個「章節」的節目時,呈現線程可能會在等待整個節目下載之前啓動,例如,等等上。

我應該使用Ruby線程還是DRb?我如何在線程之間傳遞消息?

感謝您的任何反饋!

回答

2

保持簡單開始 - 始終是最好的建議。從兩個線程開始,看看性能是否是你需要的。您可以使用條件變量或簡單Mutexes圍繞檢索到的章節列表進行同步。你可能會遇到欠載的問題 - 沒有可用的渲染章節,但你至少會有一個可行的解決方案的骨骼,只不過是使用核心Ruby。

然後通過一切手段看看提供其他可能性的解決方案。除了DRb之外,您還應該查看EventMachine(閱讀章節時可能需要的異步功能)以及RabbitMQ,以獲取消息傳遞系統提供的更一般和更鬆散的耦合。

從小開始,不要試圖移動得太快。對於任何擔心Ruby線程的人,我正在運行一個小報告,使客戶端在RabbitMQ隊列上進行偵聽。客戶端使用四個線程來呈​​現(谷歌)圖表,發送警報並自動重置各種隊列(在收集了數小時的數據之後)。所有作品都很棒!

克里斯

+0

我只考慮,因爲通過能力消息的DRb - 我不能與線程,對吧?我的意思是,我可以用互斥體破解它,但它仍然是一個黑客......對不對? :) DRb似乎更容易。 – 2009-08-28 14:00:53

+0

如果您需要多個進程,您只需要一個消息傳遞系統。這聽起來不像你需要多個進程,因此我建議保持簡單。我正在做一些類似於自己的事情(收集遠程數據,處理它並呈現輸出),並且一個簡單的線程系統會很好 - 我爲每個階段和一個附加線程都有一個線程 - 不需要DRb。但使用你認爲你需要的東西! 祝你好運! – 2009-08-29 14:33:00

+0

恕我直言,RabbitMQ建議是正確的方法。我之前用DRb和RabbitMQ做過這種事情,而DRb解決方案並不理想。 RabbitMQ的速度要快幾個數量級,如果你使用的是Celldee的Bunny庫,它也容易得多。 – 2009-09-27 01:37:00