Ruby on Rails不能很好地执行多线程请求 - 响应,或者至少ActiveRecord没有。

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

我希望您对这些设置有何看法? Rails可能不适合某些应用程序吗?

另外,Ruby on Rails中关于并发性的当前状态是什么?什么是最佳实践。这些缺点是否存在变通方法?

有帮助吗?

解决方案

Rails目前不能处理单个MRI(Matz Ruby Interpreter)Ruby流程中的并发请求。每个请求都由一个巨大的互斥锁包含。很多工作已经开始使即将推出的Rails 2.2线程安全,但是当你在Ruby 1.8x下运行时,你不会从中获得很多好处。我不能评论Ruby 1.9是否会有所不同,因为我对它不是很熟悉,但可能不是我想的。

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

其他提示

Neverblock 允许非阻止功能,而无需修改编写程序的方式。它确实是一个令人兴奋的项目,并且已经向后移植到Ruby 1.8.x(它依赖于Ruby 1.9的光纤)。它适用于PostgreSQL和MySQL,以执行非阻塞查询。 基准测试很疯狂......

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线程。

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

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

Ruby 1.9正在添加轻量级光纤:

http://www.infoq.com/news / 2007/08 /红宝石-1-9-纤维

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top