Sinatra是多線程的嗎?我讀過其他地方,「sinatra默認爲多線程」,這意味着什麼?Sinatra是多線程的嗎?
考慮這個例子
get "/multithread" do
t1 = Thread.new{
puts "sleeping for 10 sec"
sleep 10
# Actually make a call to Third party API using HTTP NET or whatever.
}
t1.join
"multi thread"
end
get "/dummy" do
"dummy"
end
如果我進入「/多線程」,隨後在另一個選項卡或瀏覽器則沒有什麼可以送達(在這種情況下,10秒)「/假的」,直到「/多線程」請求已完成。如果活動凍結應用程序變得無法響應。
我們如何解決這個問題而不會產生另一個應用程序實例?
當然,你不能繼續,因爲'.join'會阻塞,直到每個線程完成 - 請參閱:http://ruby-doc.org/core-1.9/classes/Thread.html#M001331 – asaaki 2011-06-08 13:01:03
那麼這就是例子,實際上我可能正在使用HTTP Net進行讀取文件或URI的調用,而不是專門在線程內進行讀取。如果我不希望其他請求被阻止,那麼我的工作是什麼? – ch4nd4n 2011-06-08 13:16:06
沒有產生更多的實例,我看不到任何簡單的解決方案。通常你會使用瘦或獨角獸來擁有多個實例。如果你只想在後臺做一些工作(所以不需要立即顯示調用外部資源的結果),你應該真的使用後臺作業(resque,延遲作業等),以及如果這些工作完成,可以在進一步的請求中顯示結果。一般的問題是,在大多數情況下,Ruby應用程序不可能是真正的多線程,因爲MRI還不支持多核。產卵/分叉是一種解決方法。 – asaaki 2011-06-08 15:34:14