【发布时间】:2014-03-03 12:58:50
【问题描述】:
我正在尝试在 Rails 4 中同时处理多个请求,而在 Rails 3 中使用 config.threadsafe! 和 Puma 可以很容易地做到这一点。
假设我有这个控制器
class ConcurrentController < ApplicationController
def index
sleep 10000
end
def show
end
end
我以前可以用puma -t 2:16 -p 3000(最少2个线程)启动puma,然后点击index,然后点击show,仍然可以正确渲染show。
在 Rails 4 中,如果我尝试做同样的事情,Puma 现在会锁定 index 请求,而 show 永远不会被渲染。当我为服务器点击Ctrl-C 时,Puma 给了我这个错误:
Rack app error: #<ThreadError: Attempt to unlock a mutex which is locked by another thread>
为了让并发与 Rails 4 一起工作,我在这里缺少什么? config.threadsafe! 应该是不需要的(即使我尝试也不会产生影响)
【问题讨论】:
-
你试过在生产环境中运行这个吗?
-
应该和 Rails 4 没有区别。确实 Rails 4 默认是多线程的。您的环境/配置中一定还有其他原因导致了差异。你是如何开始彪马的?在命令行中使用该命令?您可以从 development.rb 文件中分享其他任何相关内容吗?
-
@fredrik - 请查看我的回答。我花时间解释了允许并发的选项并提供了一些参考资料。不幸的是,尽管您的回答可以得出一个切实可行的解决方案,但并不完全正确。
-
我默认在
config/environments/development.rb中使用带有config.cache_classes = false的rails 5.0.3,但没有遇到这个问题。 -
尝试使用多个工作线程而不是多个线程,
-w 2。这将启动应用程序的两个实例来处理请求。
标签: ruby-on-rails ruby concurrency puma