2009-08-28 49 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