为什么rails不完全支持编写开箱即用的事件代码?



Node.js问世后,它是事件式编程的普及。但是Ruby有EventMachine,它支持编写事件代码。

在rails中支持事件的要求是:
1. 运行反应器的事件服务器(瘦,彩虹)
2. 纤维(Ruby 1.9.3)是为了使编写事件代码更容易,否则我们可以使用线程。3.所有gem事件(例如mysql2)。

Nodejs显示了事件编程的明显优势。那么,为什么rails社区不采用eventmachine呢?我认为rails不能完全移植到eventmachine的原因之一是它对底层宝石的依赖,而这些宝石可能不是事件化的。但有人知道是否有计划朝这个方向发展吗?

Rails可以做Nodejs做的事情,但是Nodejs一开始就提倡对所有库制作者进行事件编程,所以按照惯例,你添加到包中的大多数依赖项。

最大的原因是Rails生态系统不是为事件IO构建的,在应用程序中引入单个非事件IO会消除这些好处。用Ruby(和Rails)编写事件代码是非常可能的,但它不一定是直接的,因为它并不总是清楚何时执行或不执行事件IO,并且开发人员需要花费大量时间来追踪应用程序可能阻塞的位置。相比之下,Node是在IO永远不应该同步的隐含理想下创建的,它的整个生态系统都是从这个理想中流出的,这意味着开发人员不必担心他们的IO操作是否会同步;默认情况下,假设它们是异步的。

此外,事件web应用程序只有在io绑定时才真正有用。如果您的应用程序是CPU密集型的,或者正在执行繁重的同步CPU工作,那么事件模型可能不是正确的方法。Ruby可能需要大量的CPU,这主要是由于该语言的元编程结构和垃圾收集器(在Ruby 2.1中应该有很大的改进!),这可能使它不像Node那样适合事件编程。

Rails有许多可用的并发模型——分叉、抢占式线程和事件——开发人员可以选择最适合他们应用领域的模型。分叉是默认的,因为它很简单,不需要任何特殊的考虑(只要您部署在POSIX系统上!),并且Ruby在创建Rails时没有系统线程。现在,使用Ruby 1.9+(系统线程,GIL)和JRuby(没有GIL!),线程代码非常容易部署。Ruby 2.0带来了一个cow友好的垃圾收集器,这意味着分叉也比以前更有效。

在一天结束时,事件代码不是默认的,因为它需要开发人员做更多的工作,对许多人来说,默认的分叉模型已经足够好了。在这种情况下,开发人员可以选择线程代码或事件代码,这是最适合他们的基础结构和应用程序领域的。

最新更新