Мое приложение запускает до 180 заданий AJAX, которые интенсивно работают на стороне сервера (длинные запросы SELECT
).
Я хотел бы оптимизировать нагрузку на несколько ядер процессора, которые у меня есть, переключение с дизайна, в котором каждый вызов AJAX выполняется последовательно для дизайна, в котором эти запросы выполняются с максимальным, скажем, 4 параллельно.
Возможно, но уродливое решение может одновременно выдавать все 180 запросов на клиенте и использовать сервер Semaphore
на уровне Session
или Application
. Я расскажу о загрузке приложений позже.
Я хотел бы найти более приятное решение, в котором все вызовы начинаются по порядку (каждая строка в таблице представляет собой другой запрос проверки), но когда кто-то завершает работу, начинается следующее, и число (а именно, 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 в моем сценарии?
[edit] забыл обсудить требования приложений: это приложение работает вживую, но не обслуживает большую пользовательскую базу. Когда пользователь отправляет данные, которые необходимо проверить, приложение будет выполнять интенсивную работу, оставаясь бездействующим в течение длительных периодов времени.