Was bedeutet es zu sagen, dass Apache einen Thread pro Anfrage erzeugt, aber node.js nicht?

8

Ich habe über node.js und andere Server wie Apache gelesen, wo das Threading anders ist. Ich verstehe einfach nicht, was das Threading bedeutet.

Wenn ich eine Webseite habe, die SQL ausführt, um auf eine Datenbank zu treffen, sage drei verschiedene Datenbanken auf der Seite des Servers, was bedeutet das für das Threading in node.js? Apache? Was bedeutet "Thread" hier?

Oder als Artikel, den ich gesehen habe, "starte einen neuen Thread, um jede Anfrage zu bearbeiten."

Was bedeutet es zu sagen, dass Apache einen Thread pro Anfrage erzeugt, aber node.js nicht?

EDIT: Ich hoffe auf ein Beispiel, das ich verstehen kann. Ich bin es gewohnt, eine Serverseite zu haben, die auf eine Datenbank trifft. Mehrere Verbindungen innerhalb dieser Datei.

    
johnny 11.10.2013, 17:56
quelle

2 Antworten

42

Ein Thread ist ein Kontext der Programmausführung. Programme, die single-threaded sind, können nur eine Sache gleichzeitig tun, wo Multi-threaded-Programme viele Dinge auf einmal tun können.

Stellen Sie es sich vor wie eine Küche in einem Restaurant. Ein einzelner Koch kann wirklich nur eine Aufgabe nach der anderen erledigen, sei es die Meinung zerhacken oder etwas in den Ofen stellen. Wenn eine Bestellung kommt, die viel Arbeit vom Koch erfordert (wie Salate vs. Putting Sachen im Ofen und warten) einige Mahlzeiten können sich verspäten, weil der Chef beschäftigt ist. Auf der anderen Seite, wenn dieser Koch nur ein paar Sachen backen muss, gibt es nicht viel Arbeit für ihn zu tun und er kann andere Mahlzeiten machen, während er darauf wartet, dass das Essen im Ofen gemacht wird.

Bei mehreren Köchen können viele dieser Aufgaben gleichzeitig erledigt werden. Viele Mahlzeiten können gleichzeitig zubereitet werden.

Das Threading-Modell von Apache ist wie das Anstellen einer festen Anzahl von Köchen (unabhängig davon, wie viele Kunden Ihr Restaurant in dieser Nacht hat) und jeder Koch kann nur an einer Mahlzeit gleichzeitig arbeiten. Das bedeutet, dass, wenn eine Mahlzeit bestellt wird, ein engagierter Koch dieser Mahlzeit zugewiesen wird. Es wird Zeiten geben, in denen der Koch damit beschäftigt ist, Zutaten zu zerkleinern und den Kuchenteig zu mischen, aber es wird auch Zeiten geben, in denen er nur darauf wartet, dass die Kartoffeln köcheln. Zu jeder Zeit können Sie die meisten Ihrer Köche müßig sitzen lassen und darauf warten, dass die Kartoffeln kochen und backen, und es werden keine weiteren Bestellungen mehr ausgeführt, da jeder Koch sich jeweils einer Bestellung widmet.

Zu allem Überfluss ist Ihre Küche nur so groß, wie Sie es sich leisten können. Jeder Koch braucht viel Platz und Ressourcen, und Sie haben vielleicht eine Situation, in der ein paar Köche, die herumstehen und die einzigen verfügbaren Löffel halten, andere Köche davon abhalten, ihr Essen zu machen.

Nginx ist ein anderer Webserver (der oft als Proxy verwendet wird), über den Sie nicht gefragt haben, aber ich nenne ihn, um ein anderes Threading-Modell zu erklären. Es beschäftigt auch eine feste Anzahl von Köchen, aber es stellt weniger von ihnen ein. Jeder Koch kann an mehreren Mahlzeiten gleichzeitig arbeiten. Also, wenn sie auf Kartoffeln warten, um zu kochen, während ein Auftrag für einen gehackten Salat kommt, können sie an diesem Salat arbeiten, anstatt im Leerlauf zu stehen. Sie können eine kleinere Küche haben (relativ zur Größe des Restaurants / Anzahl der Kunden) und erhalten die gleiche Anzahl an Mahlzeiten oder mehr. Es ist eine enge Crew, die effektiv Zeit und Ressourcen verschwendet.

Node.js ist ein bisschen anders. Es ist single-threaded aus einer JavaScript-Perspektive, aber andere Aufgaben wie Festplatte und Netzwerk IO werden automatisch auf separaten Threads behandelt. Es ist wie eine Küche mit nur einem Koch, aber das macht in manchen Fällen Sinn. Wenn Ihre Küche viel Arbeit für diesen Koch hat, ist es vielleicht sinnvoll, mehr Köche für die Arbeit zu engagieren. (Um dies in Node.js zu tun, können Sie nur mehr Prozesse generieren, was im Prinzip so aussieht, als würden Sie eine Reihe kleiner Küchen direkt nebeneinander aufbauen. Sie können einen Mann haben, der vorne steht und die Aufträge für all diese Küchen koordiniert.) Jedoch Wenn du nur eine Bäckerei bist (hauptsächlich nur IO, mit wenig Arbeit für den Koch), brauchst du vielleicht nur einen Koch.

Um das Ganze zusammenzufassen, werden verschiedene Threading-Modelle verwendet, um Arbeit zu teilen und effektiv zu verarbeiten. Welches Threading-Modell sinnvoll ist, hängt von Ihren Anforderungen und den anderen Eigenschaften des Servers ab, den Sie auswählen.

    
Brad 11.10.2013, 18:13
quelle
1

Node.js ist single-threaded, da es nur eine Sache auf einmal tun kann. Sie können jedoch mehrere Instanzen des Knotenprozesses auf nahezu allen Cloud-Dienstanbietern ausführen. Der Apache-Prozess kann Multi-Task auf Threads.

Wenn der Knotenprozess aus irgendeinem Grund aufhört, kann nichts anderes passieren. Aus diesem Grund ist es wichtig, den Knoten asynchron zu schreiben, so dass der Knoten bei einer Datenbankabfrage immer noch Anforderungen entgegennehmen kann.

Ohne zu technisch zu werden, kann man sich einen Thread als eine Spur auf der Autobahn des Programms vorstellen. Es ist ein spezifischer Ausführungskanal. In der Lebenszeit einer Anfrage müssen viele Dinge passieren. All diese Dinge sind in einer Box.

Knoten hat keine Threads! Man kann es sich wie eine einspurige Straße vorstellen. Aber auf die Art und Weise, wie Knoten eingesetzt werden, erhalten Sie viele Instanzen dieser einspurigen Straße. Sie teilen jedoch nichts. Wenn Sie in einem Array einen Wert hinzufügen, ist der Wert nicht in dem anderen. Alles, was geteilt werden muss, muss in einem Cache oder einer Datenbankschicht geteilt werden.

    
quelle

Tags und Links