【问题标题】:Asynchronicity, threading, node.js and Ruby on Rails异步、线程、node.js 和 Ruby on Rails
【发布时间】:2011-09-22 12:30:39
【问题描述】:

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

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

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

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

【问题讨论】:

  • Illya Grigorik 对 ruby​​ 纤维、EventMachine 和 rails 做了一些工作。看看这个(尤其是底部的链接):github.com/igrigorik/async-rails
  • @igorw:这看起来很符合我的想法,请将其发布为答案,以便我投票!
  • 使 Rails 异步对我来说似乎是一种 hack。这显然看起来像是一个会严重泄漏的抽象。
  • 而不是node.js考虑使用纯Ruby的EventMachine

标签: ruby-on-rails asynchronous node.js runtime event-driven


【解决方案1】:

是的。

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

使用真正的异步语言:

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

使用编译器

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

一个例子是storm

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-15
      • 2011-10-26
      • 1970-01-01
      • 2015-08-23
      相关资源
      最近更新 更多