Ruby on rails 如何与Rails 4同时提供请求?

Ruby on rails 如何与Rails 4同时提供请求?,ruby-on-rails,ruby,concurrency,puma,Ruby On Rails,Ruby,Concurrency,Puma,我正在尝试在Rails 4中同时处理多个请求,这是我能够用config.threadsafe轻松完成的和Puma 假设我有这个控制器 class ConcurrentController < ApplicationController def index sleep 10000 end def show end end 我在这里遗漏了什么来获得与Rails 4协同工作的并发性config.threadsafe应该是不需要的(即使我尝试也不会有什么不同)您可以尝试

我正在尝试在Rails 4中同时处理多个请求,这是我能够用
config.threadsafe轻松完成的和
Puma

假设我有这个控制器

class ConcurrentController < ApplicationController
  def index
    sleep 10000
  end

  def show
  end
end

我在这里遗漏了什么来获得与Rails 4协同工作的并发性<代码>config.threadsafe
应该是不需要的(即使我尝试也不会有什么不同)

您可以尝试unicorn这在开发模式下非常简单:


在Rails 4中,默认情况下,开发环境中不启用并发请求

我在网上找到了这句话

Lock将应用程序包装在互斥锁中,因此一次只能由单个线程调用。仅当config.cache_classes为false时启用

这意味着如果
config.cache\u classes=false
(在dev env中是默认值),我们就不能有并发请求

并发请求在生产环境中与我的示例一起工作

一种解决方案是在开发环境中设置
config.cache\u classes=true
,但是代码不会在更改时重新加载,这对开发来说并不真正有效

第二种黑客解决方案是在开发中禁用
Rack::Lock
中间件

因此,如果要添加
development.rb
以下行:

config.middleware.delete Rack::Lock

您应该能够在禁用缓存类的开发环境中进行并发请求。

我邀请您阅读
config.threadsafe的配置选项
它将帮助您更好地理解
config.threadsafe的选项,特别是允许并发

在Rails 4
config.threadsafe中


现在来看看答案 在Rails 4中,默认情况下,请求由开发环境中的Rack::Lock中间件包装在互斥对象周围

如果要启用并发,可以设置
config.allow\u concurrency=true
。这将禁用Rack::Lock中间件。我不会像你问题的另一个答案中提到的那样删除它;对我来说,这看起来像是一种恶作剧

注意:如果您有
config.cache\u classes=true
,则对
config.allow\u concurrency
(Rack::Lock request mutex)的赋值将不会生效 实际上,默认情况下允许并发请求。如果你有
config.cache\u classes=false
,然后可以设置
config.允许并发
true
false
。在开发中 你会想要这样的环境吗

config.cache_classes=false
config.allow_concurrency=true
语句:这意味着如果config.cache\u classes=false (在dev env中是默认的)我们不能有并发的 请求。这是不对的

附录 您可以参考,它设置了一个使用MRI和JRuby测试并发性的实验。结果令人惊讶。MRI比JRuby快

MRI并发性的实验正在进行中。
实验只测试并发请求。控制器中没有竞争条件。然而,我认为实现上面文章中的示例来测试控制器中的竞争条件并不太困难。

您是否尝试过在生产环境中运行它?Rails 4应该没有什么不同。事实上,Rails 4在默认情况下是多线程的。您的环境/配置中一定有其他原因导致了差异。你是怎么开始彪马的?在命令行中使用该命令?您还可以从development.rb文件中分享其他相关内容吗?@fredrik-请查看我的答案。我花时间解释了允许并发的选项,并提供了一些参考。不幸的是,尽管您的答案可以引出一个实用的解决方案,但它并不完全正确。我默认情况下在
config/environments/development.rb
中使用rails 5.0.3,并在
-w 2
中使用
config.cache\u classes=false
。这将启动应用程序的两个实例来处理请求。您在哪里使用MRI Ruby或JRuby?我的印象是,使用MRI Ruby时,多线程在这样一个示例中不起作用。我可以看到Puma有一个集群模式(用于指定工作人员):但我无法让这个示例工作(使用“睡眠”)删除这个中间件@Fredrik?@JoãoPauloMotta有什么缺点请查看我的答案。我在一篇讨论你问题的博文上找到了一个链接。缺点是你必须在你的控制器内考虑比赛条件。删除机架::锁对我来说不太合适。它加载了页面,但给了我连接数据库的超时:“ActiveRecord::ConnectionNotesAblished(ActiveRecord::ConnectionNotesAblished):”这似乎是正确的,我将把它标记为正确答案,尽管我没有花时间测试它。不过我会注意到,config.allow_并发性是一个完全没有文档记录的特性。它出现在Rails3的文档中,但不在Rails4中。是的,没错。关于该配置选项的未来使用,我们没有太多文档。此外,我还记得,考虑将数据库连接的连接池设置为与最大线程数相同的大小。就你的情况而言,16。
config.cache_classes=false
config.allow_concurrency=true