在Ruby on Rails中,线程,并发和分叉进程的当前状态是什么?

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

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

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

另外,Ruby on Rails中关于并发性的当前事态是什么? 什么是最佳实践。 有缺点的解决方法吗?

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

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

Neverblock允许非阻塞function,而无需修改编写程序的方式。 它确实是一个令人兴奋的项目,并且已经向后移植到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/ruby-1-9-fibers