2012-12-03 76 views
2

我試圖圍繞從MRI與JRuby的角度來看多線程。通過ruby app.rb瞭解簡單的Sinatra應用程序中的紅寶石多線程

require 'sinatra' 

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

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

上的紅寶石1.9.3運行此,我期待的是,當被調用/long我將無法完成任何其他要求: 我做了簡單的末日應用程序。但事實證明,即使/long正在等待完成,我也可以在不同的瀏覽器中撥打/other

而我卡在這裏。我認爲這應該是JRuby(應用程序運行時,例如在特立尼達),但不適用於MRI。我想我必須產生幾個實例來使它以這種方式工作。

有人能解釋我在哪裏我錯了嗎?爲什麼我仍然可以從其他請求中得到迴應,即使長時間運行一個塊?

回答

3

MRI中有一個全局解釋器鎖,可防止兩個線程一起運行。在你的例子中,你的長線程正在休眠(無所事事),因此MRI可以掛起它並運行其他線程。如果兩個線程都佔用100%的cpu時間,那麼你會期望其中一個線程等待另一個線程。如果你有JRuby,那麼你會讓每個線程從每個內核獲得100%的CPU時間(假設你有多核處理器),因此你的線程不會放慢速度。

以下文章應深入解答您的問題:http://ablogaboutcode.com/2012/02/06/the-ruby-global-interpreter-lock/

+0

偉大的文章。謝謝 – grafthez

+0

這是錯誤的。 mri不再使用綠色線程,這就是GIL的原因。當我們還有綠線時,我們不需要GIL。 – Cubic

+0

謝謝。你是對的。綠線被GIL取代。我更新了我的答案。 –