Parallele AJAX-Anfragen in jQuery

9

Meine Anwendung führt bis zu 180 AJAX-Jobs aus, die auf der Serverseite IO-intensiv sind (lange laufende SELECT -Abfragen).

Ich möchte die Last der mehreren CPU-Kerne, die ich zur Verfügung habe, optimieren, indem ich von einem Design, in dem jeder AJAX-Aufruf sequentiell ausgeführt wird, zu einem Design umschaltet, in dem diese Anfragen mit maximal 4 parallel ausgeführt werden .

Eine mögliche, aber hässliche Lösung könnte sein, dass alle 180 Anfragen gleichzeitig auf dem Client ausgegeben werden und der Server eine Semaphore auf Session oder Application Ebene gespeichert hat. Ich werde später über Anwendungs-Workloads sprechen.

Ich möchte eine bessere Lösung finden, bei der alle Anrufe in der Reihenfolge gestartet werden (jede Zeile in einer Tabelle ist eine andere Abfrage), aber wenn eine beendet wird, wird die nächste gestartet und es gibt eine Nummer (nämlich 4) von gleichzeitige AJAX-Anfragen mit ihren jeweiligen Laderindikatoren.

Ich habe versucht, Threadpool-js zu verwenden, aber ich habe selbst festgestellt, dass ich jQuery von Arbeitern nicht verwenden kann

Mein aktueller Code ist der folgende

%Vor%

Ergebnis ist das Folgende:

Die Frage ist: Welchen Ansatz kann ich verfolgen, um in meinem Szenario gleichzeitige AJAX-Anfragen zu erstellen?

[edit] hat vergessen, die Anforderungen der Anwendung zu besprechen: Diese Anwendung läuft zwar live, aber sie bedient keine große Benutzerbasis. Wenn ein Benutzer Daten zur Überprüfung einreicht, führt die Anwendung einen intensiven Betrieb aus, während sie für längere Zeit im Leerlauf bleibt.

    
usr-local-ΕΨΗΕΛΩΝ 19.06.2015, 08:51
quelle

4 Antworten

2

$.ajax() ist eine asynchrone Funktion, die eine Anfrage initiiert und dann sofort zurückkehrt. Wenn Sie es also mehrmals hintereinander aufrufen, werden gleichzeitige Anfragen erstellt.

Ihr Code wird weiterhin in einem einzelnen Thread ausgeführt, die HTTP-Anforderungen werden jedoch parallel im Hintergrund ausgeführt und jQuery ruft Ihre Rückrufe auf, wenn sie Daten zurückgeben. So erhalten Sie Parallelität, ohne sich direkt mit Threads auseinandersetzen zu müssen.

In Ihrem GlobalCheck() :

%Vor%

startet vier parallele Anfragen, und Ihr bestehender Code löst jedes Mal eine neue Anfrage aus, so dass Sie immer 4 parallele Anfragen ausführen müssen. Und da Ihr Code nur in einem einzelnen Thread ausgeführt wird, müssen Sie sich keine Gedanken über Nebenläufigkeitsprobleme mit Ihrer done -Variable usw. machen.

Erhöhen Sie bei gleichzeitigen Anfragen einfach den Wert von CONCURRENT_REQUESTS , aber beachten Sie, dass Sie sehr schnell die Begrenzung der gleichzeitigen Anfragen auf eine einzelne Domain erreichen - sie variiert je nach Browser, ist aber immer eine ziemlich kleine Zahl. Siehe diese Antwort für Details .

    
CupawnTae 19.06.2015, 09:03
quelle
1

Wenn Sie zum Beispiel einen Ajax-Aufruf in einer Funktion 'doCall' haben, starten Sie diese Funktion einfach für eine x-Menge, die von den gewünschten 'threads' abhängt.

%Vor%

Jetzt haben Sie 3 Threads. Um es in Gang zu halten, starten Sie die Funktion in der Funktion neu. In der doCall-Funktion haben Sie also einen anderen doCall (x), um den Thread am Leben zu halten.

Sie haben eine Art "Schleife", und die Anfragen werden weiterhin asynchron ausgelöst.

    
W van Rij 19.06.2015 09:09
quelle
0

Meiner Meinung nach brauchen Sie ein Array "nbRequest", um zu wissen, wie viele Anfragen Sie haben. (4 max)

Verwenden Sie dann setInterval.

Starten Sie das Intervall, speichern Sie Ihre "num" in "nbRequest". Wenn die Ajax-Anfrage beendet ist, entferne deine "num" von "nbRequest".

In der Zwischenzeit wird im Intervall überprüft, ob die Länge von "nbRequest" gleich 4 ist. Wenn nicht, starten Sie eine neue Anfrage.

Wenn "done == num", stoppen Sie das Intervall.

    
ThinkTank 19.06.2015 09:24
quelle
0

Hinweis: Die Anzahl gleichzeitiger Anfragen, die Browser an eine bestimmte Domain stellen können, ist begrenzt. Sie können also alle Ihre Anfragen auf einmal auslösen, der Browser kümmert sich darum, sie in die Warteschlange zu stellen und nur etwa 6 bis 8 gleichzeitig auszuführen.

Quelle: Max parallele http-Verbindungen in einem Browser?

Wenn Sie jedoch eine genauere Kontrolle wünschen, können Sie etwas wie folgt implementieren:

%Vor%

Ich überlasse Ihnen die Fehlerbehandlung.

Und wenn Sie Logik hinzufügen müssen, wenn Sie erkennen wollen, wann alle Anfragen erledigt sind. Vielleicht in Versprechen schauen.

    
Pierre Henry 19.06.2015 09:45
quelle

Tags und Links