7

Ruby on Rails 不能很好地处理多线程请求响应,或者至少 ActiveRecord 不能。

在创建需要很长时间才能完成的 shell 命令的 Web 应用程序时,同时只有一个请求-响应处于活动状态的概念可能会很麻烦。

我想谈谈你对这类设置的一些看法?Rails 可能不适合某些应用程序吗?

此外,关于 Ruby on Rails 中的并发性,目前的状况是什么?什么是最佳实践。有没有针对缺点的解决方法?

4

5 回答 5

4

Rails 目前不处理单个 MRI (Matz Ruby Interpreter) Ruby 进程中的并发请求。每个请求本质上都用一个巨大的互斥体包装。为使即将推出的 Rails 2.2 线程安全而做了大量工作,但在 Ruby 1.8x 下运行时,您不会从中获得很多好处。我无法评论 Ruby 1.9 是否会有所不同,因为我对它不是很熟悉,但我可能没有想到。

在这方面看起来非常有前途的一个领域是使用 JRuby 运行 Rails,因为 JVM 通常被认为擅长多线程。Sun Microsystems 的Arun Gupta最近在 RailsConf Europe 上给出了一些有趣的性能数据。

于 2008-09-24T19:29:19.230 回答
3

Matz 的 Ruby 1.8 使用绿色线程,而 Matz 的 Ruby 1.9 将使用原生 O/S 线程。Ruby 1.8 的其他实现,例如 JRuby 和 IronRuby,使用本机 O/S 线程。YARV 是 Yet Another Ruby VM 的缩写,它也使用本机 O/S 线程,但具有全局解释器锁,以确保在任何给定时间只有一个 Ruby 线程正在执行。

于 2008-09-25T13:43:23.483 回答
3

Neverblock允许在不修改您编写程序的方式的情况下实现非阻塞功能。这确实是一个令人兴奋的项目,并且被反向移植到 Ruby 1.8.x 上(它依赖于 Ruby 1.9 的纤维)。它与 PostgreSQL 和 MySQL 一起工作以执行非阻塞查询。基准疯狂...

于 2008-09-26T05:31:55.277 回答
2

如果您在 shell 上运行的内容对于页面的呈现不是必需的(例如,您只是触发维护任务或其他内容),您应该将它们作为后台进程启动。看看八哥和工作。

如果这不适用于您的情况,您必须确保应用服务器的多个实例运行。传统上人们会启动多个 Mongrel 实例。但现在我想说的是,到目前为止,最简单的方法是使用Phusion Passenger。它是一个 Apache 模块,可让您轻松指定要运行的应用服务器的实例数(最小和最大)。其余的由乘客完成。如果我没记错的话,它不会做愚蠢的循环调度请求。我认为这是由可用性决定的。

于 2008-09-25T13:02:49.213 回答
1

Ruby 1.9 正在添加轻量级 Fiber:

http://www.infoq.com/news/2007/08/ruby-1-9-fibers

于 2008-09-26T04:15:36.663 回答