2

从 MRI 与 JRuby 的角度来看,我正试图围绕多线程进行思考。我已经完成了简单的 sinatra 应用程序:

require 'sinatra'

get '/long' do
  sleep(10)
  "Long operation finished"
end

get '/other' do
  "Time now is #{Time.now}"
end

通过我在 ruby​​ 1.9.3 上运行它,ruby app.rb我期望当/long被调用时我将无法完成任何其他请求。但事实证明,/other即使在/long等待完成时,我也可以在不同的浏览器中调用。

我被困在这里。我认为这应该适用于 JRuby(当应用程序在特立尼达上运行时),但不适用于 MRI。我想我必须生成几个实例才能让它以这种方式工作。

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

4

1 回答 1

3

MRI 中有一个全局解释器锁,可防止两个线程一起运行。在您的示例中,您的长线程正在休眠(什么都不做),因此 MRI 可以挂起它并运行另一个线程。如果两个线程都占用了 100% 的 cpu 时间,那么您会期望其中一个线程等待另一个线程。如果您有 JRuby,那么您将让每个线程从每个核心占用 100% 的 CPU 时间(假设您有多核处理器),因此您的线程不会减慢速度。

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

于 2012-12-03T22:39:56.477 回答