0

除了使用不同的脚本语言之外,node.js 的主要吸引力似乎在于它支持事件驱动的编程,这使得编写可扩展的服务器(或其他典型的 I/O 绑定应用程序)变得更容易,因为它简化了非阻塞 I/O 调用。但是,此功能的代价是必须学习一种新的编程模型,该模型本质上要求您在回调函数之后传递回调,从而使一些简单的任务(例如,相关的动作序列)变得更加复杂。

将该编程模型与传统的 Ruby on Rails 进行对比,后者阻塞所有 I/O 操作并且(有效地)是单线程的(由于 MRI 的绿色线程实现)。

只是在这里大声梦想,似乎应该可以实现一个 Ruby(或 Rails)运行时,它通过捕获 I/O 调用来协调这些模型,透明地用它们的非阻塞版本替换它们,存储当前的延续并调用它当 I/O 操作完成时。通过这种方式,您将获得熟悉的过程式编程风格以及事件驱动/异步/回调模型的好处。

这样的运行时(或运行时翻译器)在技术上是否可行?是否已经有网络框架可以做这样的事情?

4

2 回答 2

2

是的。

进行异步但命令式编程有两种可能性

使用真正的异步语言:

Erlang 将是一个示例,您可以在其中编写命令式执行此操作,执行该代码并将其转换为异步。我不认为它会一路走来。

使用编译器

您可以使用将阻塞样式代码转换为非阻塞代码的编译器。我个人强烈建议不要这样做,因为它是一个黑匣子,是调试的噩梦。

一个例子是风暴

但是,此功能的代价是必须学习一种新的编程模型,该模型本质上要求您在回调函数之后传递回调,从而使一些简单的任务(例如,相关的动作序列)变得更加复杂。

但是,我建议您硬着头皮进行范式转换。从长远来看,这将是一项更好的投资。请注意,没有必要使用 node.js,还有像 erlang 和 haskell 这样的强大替代品。

于 2011-06-25T07:46:51.133 回答
0

感谢@igorw,async-rails项目正是我的想象。

但正如@Raynos 和@apneadiving 指出的那样,有可能更好的解决方案,例如Ruby EventMachinestormjs

于 2011-06-27T20:53:15.567 回答