我在Rails控制器中有以下内容:
def poll
records = []
start_time = Time.now.to_i
while records.length == 0 do
records = Something.uncached{Something.find(:all,
:conditions => { :some_condition => false})}
if records.length > 0
break
end
sleep 1
if Time.now.to_i - start_time >= 20
break
end
end
responseData = []
records.each do |record|
responseData << {
'something' => record.some_value
}
# Flag message as received.
record.some_condition = true
record.save
end
render :text => responseData.to_json
end
然后我有Javascript执行AJAX请求。请求在那里停留20秒或直到控制器方法在数据库中找到记录,等待。这很有效。
function poll() {
$.ajax({
url: '/my_controller/poll',
type: 'GET',
dataType: 'json',
cache: false,
data: 'time=' + new Date().getTime(),
success: function(response) {
// show response here
},
complete: function() {
poll();
},
error: function() {
alert('error');
poll();
}
});
}
当我在浏览器中打开5-10个标签时,我的网络应用程序变得非常慢。
这是预期的吗?或者我可以做出一些明显的改进吗?
答案 0 :(得分:2)
嗯..这不是最好的方法。
根据您选择的服务器解决方案,您可能拥有1,2,... x可用的服务器线程。 (例如,当您运行脚本/服务器时,您只能获得一个线程。) 当您“睡眠”时,服务器线程被阻止,无法为任何其他请求提供服务。由于线程数有限,其他请求会“等待”运行请求完成。
您必须实现逻辑cient端(在JS中)。您可以每秒将服务器池化10次,或者直到找到记录。
可以解决问题的jQuery库是jQuery Timers。