La mia applicazione può eseguire fino a 180 processi AJAX ad alto utilizzo di IO sul lato server (lunghe interrogazioni SELECT
).Richieste AJAX parallele in jQuery
Vorrei ottimizzare il carico dei più core CPU che ho a disposizione, passando da un progetto in cui ogni chiamata AJAX viene eseguita in sequenza a un progetto in cui queste richieste vengono eseguite con un massimo di, ad esempio, 4 in parallelo.
Una possibile soluzione, ma brutto potrebbe essere emette tutti i 180 richieste al tempo stesso sul client e hanno utilizzare il server un Semaphore
conservato a Session
o Application
livello. Discuterò in seguito sui carichi di lavoro dell'applicazione.
Mi piacerebbe trovare una soluzione migliore in cui le chiamate siano tutte avviate in ordine (ogni riga di una tabella è una query di controllo diversa) ma quando qualcuno termina, viene avviato il successivo e c'è un numero (in particolare 4) di richieste AJAX simultanee con i rispettivi indicatori del caricatore.
Ho provato ad utilizzare Threadpool-js ma ho trovato me stesso che non posso usare jQuery dai lavoratori
Il mio codice attuale è la seguente
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();
}
});
}
risultato è il seguente:
La domanda è: quale approccio posso seguire per creare richieste AJAX simultanee nel mio scenario?
[modifica] dimenticato di discutere le richieste delle applicazioni: questa applicazione è in esecuzione dal vivo ma non serve una vasta base di utenti. Quando un utente invia i dati da controllare, l'applicazione eseguirà operazioni intensive, rimanendo inattiva per lunghi periodi di tempo.
Grazie, ho aggiornato la mia risposta di conseguenza e collegato alla domanda più aggiornata. –