我的应用程序在服务器端运行高达180个AJAX作业,这些作业是IO密集型的(长时间运行的SELECT
查询)。
我想优化我有的多个CPU核心的负载,从一个顺序执行每个AJAX调用的设计切换到一个设计,在这个设计中,这些请求最多可以并行执行4个。
一个可能的但不美观的解决方案可能是在客户端同时发出所有180个请求,并让服务器使用存储在Session
或Application
级别的Semaphore
。稍后我将讨论应用程序工作量。
我想找到一种更好的解决方案,在这个方案中,所有调用都按顺序启动(表上的每一行是一个不同的检查查询),但是当任何一个调用终止时,下一个调用就会开始,并且会有一定数量(即4个)的并发AJAX请求及其对应的装载器指示器。
我尝试使用Threadpool-js,但我发现我不能从工作者中使用jQuery。
我当前的代码如下:
function GlobalCheck() { //entry point
if (ValidateDate()) {
//Below are global variables
list = $(".chkClass:checked"); //Only checked rows deal to AJAX request
num = $(".chkClass:checked").length; //Total number of ajax calls
done = 0; //Count of complete calls. When it reaches num we are done!
if (list.length == 0) {
alert('...');
return;
}
$(".pMessage").fadeOut();
$(".tbStatus").html('');
$(".submit").hide();
$(".exportFunctions").fadeOut();
$(".loader").show();
$(":checkbox").attr('disabled', true);
SingleCheck(0); //simplification, I do other non interesting things here
}
}
function SingleCheck(index) {
aValue = $($(list).get(index)).val();
var splitted = aValue.split('_');
$('#loader_' + aValue).show();
$('#green_' + aValue).hide();
$('#yellow_' + aValue).hide();
$('#red_' + aValue).hide();
$('#print_' + aValue).hide();
$('#xls_' + aValue).hide();
$('#summ_' + aValue).hide();
$.ajax({
type: 'GET',
url: '@Url.Action("Single", "Check")',
data: {
pType: splitted[0],
pIdQuery: splitted[1],
pDateBegin: $('#date_begin').attr('value'),
pDateEnd: $('#date_end').attr('value'),
pNow: Math.floor(Math.random() * 1000000)
},
success: function (data) {
if (!CheckSessionExpired(data)) {
//alert(data);
$("#tdStatus_" + aValue).html(data);
$("#loader_" + aValue).hide();
done++; //Done 1 more query
$(".progress").each(function (i, cRow) { $(this).html([update status]); });
if (done == num) { // Finish?
FinishCheck();
}
else {
SingleCheck(done); //Go to the next
}
}
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert(errorThrown);
RedirectToError();
}
});
}
结果如下:
问题是:在我的情况下,我应该采取什么方法来创建并发的AJAX请求?
[编辑] 忘了讨论应用需求:该应用程序正在运行,但不为大量用户提供服务。当用户提交要检查的数据时,应用程序将执行密集操作,同时闲置很长时间。