Ruby on rails 3 为什么rails不完全支持直接编写事件代码

Ruby on rails 3 为什么rails不完全支持直接编写事件代码,ruby-on-rails-3,node.js,eventmachine,Ruby On Rails 3,Node.js,Eventmachine,在Node.js问世后,它是普及事件编程的一件事。 但是,Ruby确实有支持编写事件代码的EventMachine 在rails中支持事件的要求是: 1.运行反应堆的事件服务器(薄的彩虹状服务器) 2.光纤(Ruby 1.9.3)以使编写事件代码更容易,否则我们可以使用线程。 3.所有gems事件(例如mysql2) Nodejs显示了事件编程的明显优势。那么为什么rails社区不采用eventmachine呢?我认为rails不能完全移植到eventmachine的原因之一是因为它依赖于底层的

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

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

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


Rails可以做Nodejs所做的事情,但Nodejs一开始就在所有库生成器上提倡事件化编程,因此按照惯例,您在node中添加到package.json的大多数依赖项都会发生事件,并且会在开箱即用的情况下与Nodejs一起工作。

最大的原因是Rails生态系统不是为事件化IO构建的,在应用程序中引入一个非事件IO消除了这些好处。用Ruby(和Rails)编写事件代码是很有可能的,但这并不一定是简单的,因为Gem何时执行或不执行事件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友好的垃圾收集器,这意味着分叉也比以前更有效


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

这将导致我们都进入回调地狱。有一种方法可以避免,当Ryan Dhal为NodeJ选择JavaScript(例如,与Ruby相比)时,他考虑了两件事:(1)JavaScript没有IO库,因此它们都可以从头构建为异步的(2)该语言最初是以事件驱动的方式使用的。您提到的问题——改变Rails的使用方式几乎是JavaScript被选中而不是ruby for nodejs的最大原因(V8 JavaScript引擎非常棒,但不是很重要)。我认为Chris的回答很好地概括了这一点。另外,祝你好运找到一个“来自可靠和/或官方来源”的答案。关于为什么编码社区没有采用特定的技术:)+1表示“默认分叉模型足够好”。我的经验是,这对很多网络应用来说都是正确的。我会用+1作为解释清楚的答案,但我强烈不同意“事件代码不是默认的,因为它需要开发人员做更多的工作”。在使用事件模型(如nodejs和rails模型)的系统上工作过,我认为一旦习惯了,就不需要再做任何工作了。刚开始的时候有一个陡峭的学习曲线,但一旦你通过了这个学习曲线,就只需使用分叉模型编码了。在Rails生态系统中,这需要更多的工作,因为你要自己检查所有的IO。在一个类似节点的生态系统中,您没有这样的精神开销。带em同步模型的光纤非常棒,如果你能做到的话!哦,我完全同意。事件IO是rails生态系统中的开发人员目前要做的更多工作。我没有从你的回答中推断出来;我认为问题的背景暗示了这一点