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