【问题标题】:Understand ruby multi-threading in simple Sinatra app了解简单 Sinatra 应用程序中的 ruby​​ 多线程
【发布时间】:2012-12-03 22:31:03
【问题描述】:

我正试图从 MRI 与 JRuby 的角度来考虑多线程。 我已经完成了简单的 sinatra 应用程序:

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 被调用时,我将无法完成任何其他请求。但事实证明,即使/long 正在等待完成,我也可以在不同的浏览器中调用/other

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

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

【问题讨论】:

    标签: ruby multithreading sinatra jruby


    【解决方案1】:

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

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

    【讨论】:

    • 错了。 mri 不再使用绿色线程,这就是存在 GIL 的原因。当我们还有绿色线程时,我们不需要 GIL。
    • 谢谢。你说的对。绿线被 GIL 取代。我更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-12
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 2012-03-02
    • 2012-11-12
    • 2015-05-29
    相关资源
    最近更新 更多