Ruby on Rails不能很好地执行多线程请求 - 响应,或者至少ActiveRecord没有。
创建只需要很长时间才能完成的shell命令的Web应用程序时,只有一个请求响应同时处于活动状态的概念可能会很麻烦。
我希望您对这些设置有何看法? Rails可能不适合某些应用程序吗?
另外,Ruby on Rails中关于并发性的当前状态是什么?什么是最佳实践。这些缺点是否存在变通方法?
答案 0 :(得分: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上对此设置进行了一些interesting performance figures。
答案 1 :(得分:3)
Matz的Ruby 1.8使用green threads,而Matz的Ruby 1.9将使用本机O / S线程。 Ruby 1.8的其他实现,例如JRuby和IronRuby,使用本机O / S线程。 YARV是Yet Another Ruby VM的缩写,也使用本机O / S线程,但具有全局解释器锁,以确保在任何给定时间只执行一个Ruby线程。
答案 2 :(得分:3)
Neverblock允许非阻塞功能,而无需修改编写程序的方式。它确实是一个令人兴奋的项目,并且已经向后移植到Ruby 1.8.x(它依赖于Ruby 1.9的光纤)。它适用于PostgreSQL和MySQL,以执行非阻塞查询。 benchmarks很疯狂......
答案 3 :(得分:2)
如果您在shell上运行的内容不是呈现页面所必需的(例如,您只是触发维护任务或其他内容),则应将它们作为后台进程启动。看看椋鸟和工作。
如果这不适用于您的情况,则必须确保运行应用服务器的多个实例。传统上人们会启动Mongrel的多个实例。但是现在我要说最简单的方法是使用Phusion Passenger进行稳定的设置。它是一个Apache模块,可让您轻松指定要运行的应用服务器的实例数(最小和最大)。乘客完成其余的工作。如果我没记错的话,它不会为调度请求做愚蠢的循环。我认为这是可用性的。
答案 4 :(得分:1)
Ruby 1.9正在添加轻量级光纤: