我试图从MRI与JRuby的角度来看我的脑袋绕多线程。 我做了简单的sinatra app:
require 'sinatra'
get '/long' do
sleep(10)
"Long operation finished"
end
get '/other' do
"Time now is #{Time.now}"
end
通过ruby app.rb
在ruby 1.9.3上运行此功能我希望在调用/long
时我无法完成任何其他请求。但事实证明,即使/other
等待完成,我也可以在不同的浏览器中拨打/long
。
我被困在这里。我认为这应该适用于JRuby(当应用程序运行时,例如在Trinidad上)但不适用于MRI。我想我必须产生几个实例让它以这种方式工作。
有人可以解释一下我错在哪里吗?为什么我仍然可以从其他请求得到响应,即使长时间运行的一个块?
答案 0 :(得分:3)
MRI中有一个Global Interpreter Lock可以阻止两个线程一起运行。在您的示例中,您的长线程正在休眠(无所事事),因此MRI可以暂停它并运行另一个线程。如果两个线程占用100%的cpu时间,那么你会期望其中一个线程等待另一个。如果你有JRuby,那么你会让每个线程从每个核心占用100%的CPU时间(假设你有多核处理器),这样你的线程就不会慢下来。
以下文章应该深入回答您的问题:http://ablogaboutcode.com/2012/02/06/the-ruby-global-interpreter-lock/