在简单的Sinatra应用程序中理解ruby多线程

时间:2012-12-03 22:31:03

标签: ruby multithreading sinatra jruby

我试图从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。我想我必须产生几个实例让它以这种方式工作。

有人可以解释一下我错在哪里吗?为什么我仍然可以从其他请求得到响应,即使长时间运行的一个块?

1 个答案:

答案 0 :(得分:3)

MRI中有一个Global Interpreter Lock可以阻止两个线程一起运行。在您的示例中,您的长线程正在休眠(无所事事),因此MRI可以暂停它并运行另一个线程。如果两个线程占用100%的cpu时间,那么你会期望其中一个线程等待另一个。如果你有JRuby,那么你会让每个线程从每个核心占用100%的CPU时间(假设你有多核处理器),这样你的线程就不会慢下来。

以下文章应该深入回答您的问题:http://ablogaboutcode.com/2012/02/06/the-ruby-global-interpreter-lock/