gpt4 book ai didi

ruby - 在简单的 Sinatra 应用程序中了解 ruby​​ 多线程

转载 作者:数据小太阳 更新时间:2023-10-29 08:50:42 24 4
gpt4 key购买 nike

我正试图从 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 应该是正确的(当应用程序运行时,例如在 Trinidad 上)而不是 MRI。我想我必须产生几个实例才能让它以这种方式工作。

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

最佳答案

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

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

关于ruby - 在简单的 Sinatra 应用程序中了解 ruby​​ 多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13692938/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com