untergeordneter Prozess von node.js - Unterschied zwischen Spawn und Fork

141

Dies mag wie eine grundlegende Frage erscheinen, aber ich konnte keine Dokumentation finden:

Was ist der Unterschied zwischen dem Forken und Laichen eines node.js-Prozesses? Ich habe gelesen, dass das Gabeln ein Sonderfall des Laichens ist, aber was sind die verschiedenen Anwendungsfälle / Auswirkungen für die Verwendung von jedem von ihnen?

Hitesh
quelle

Antworten:

215

Spawn ist ein Befehl zum Ausführen von Systembefehlen. Wenn Sie spawn ausführen, senden Sie ihm einen Systembefehl, der in einem eigenen Prozess ausgeführt wird, aber keinen weiteren Code in Ihrem Knotenprozess ausführt. Sie können Listener für den Prozess hinzufügen, den Sie erzeugt haben, damit Ihr Code mit dem erzeugten Prozess interagieren kann, aber keine neue V8-Instanz erstellt wird (es sei denn, Ihr Befehl ist natürlich ein anderer Knotenbefehl, aber in diesem Fall sollten Sie fork verwenden!) Und Auf dem Prozessor ist nur eine Kopie Ihres Knotenmoduls aktiv.

Fork ist eine spezielle Instanz von Spawn, die eine neue Instanz der V8-Engine ausführt. Das heißt, Sie können im Wesentlichen mehrere Worker erstellen, die auf genau derselben Node-Codebasis oder möglicherweise einem anderen Modul für eine bestimmte Aufgabe ausgeführt werden. Dies ist am nützlichsten zum Erstellen eines Worker-Pools. Während das asynchrone Ereignismodell des Knotens die recht effiziente Verwendung eines einzelnen Kerns einer Maschine ermöglicht, kann ein Knotenprozess keine Mehrkernmaschinen verwenden. Der einfachste Weg, dies zu erreichen, besteht darin, mehrere Kopien desselben Programms auf einem einzigen Prozessor auszuführen.

Eine gute Faustregel ist ein bis zwei Knotenprozesse pro Kern, möglicherweise mehr für Maschinen mit einem guten RAM-Takt / CPU-Takt-Verhältnis oder für Knotenprozesse, die viel E / A und wenig CPU-Arbeit erfordern, um die Ausfallzeit des Ereignisses zu minimieren Schleife wartet auf neue Ereignisse. Der letztere Vorschlag ist jedoch eine Mikrooptimierung und würde ein sorgfältiges Benchmarking erfordern, um sicherzustellen, dass Ihre Situation den Anforderungen für viele Prozesse / Kern entspricht. Sie können die Leistung tatsächlich verringern, indem Sie zu viele Mitarbeiter für Ihre Maschine / Ihr Szenario erzeugen.

Letztendlich können Sie Spawn auf die oben beschriebene Weise verwenden, indem Sie Spawn einen Node-Befehl senden. Dies wäre jedoch albern, da Fork einige Schritte unternimmt, um den Prozess der Erstellung von V8-Instanzen zu optimieren. Nur um klar zu machen, dass Spawn letztendlich Gabel umfasst. Die Gabel ist für diesen speziellen und sehr nützlichen Anwendungsfall einfach optimal.

http://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback

ChrisCM
quelle
@ChrisCM, wenn ich var child = require('child_process').fork('child.js');zum Beispiel in meiner Haupt-App verwende, werden jetzt 2 separate Kerne ausgeführt. Wenn ich eine schwere for-Schleife in child.js (Prozess) ausführen würde, würde ich im Wesentlichen mehr Kerne verwenden, um child.js mit Strom zu versorgen, oder? Würde sich diese CPU-Nutzung jedoch auf meinen Haupt-App-Kern auswirken?
NiCk Newman
2
Es ist unmöglich, irgendetwas auf einer CPU zu tun, ohne andere Dinge zu beeinflussen. Zeitplanung, gemeinsame Cache-Nutzung, BUS-Verkehr usw. Es sollte jedoch ein separater Kern verwendet werden, und Ihre Hauptlaufschleife bleibt davon höchst unberührt. Wie in, nicht die schwerwiegenden negativen Auswirkungen, die Sie erwarten würden, wenn zwei Prozesse auf demselben Single-Core-Prozessor ausgeführt würden. An diesem Punkt ist es wirklich Sache des Betriebssystems und der Hardware-Einrichtung, richtig zu optimieren. Unterschiedliche Einstellungen können zu unterschiedlichen Ergebnissen führen.
ChrisCM
@ChrisCM Ja, ich verwende eine globale MonsterLoop, um die Monsterpositionierung zu synchronisieren, und das Objekt, das es iteriert, kann bis zu 5.000 Schlüssel umfassen. Ich iteriere alle 2 Sekunden darüber und es scheint, als würde es Hunderte von Speicherauslastungen von meiner CPU (Hauptspiel eins) reduzieren. Ich würde es lieber so machen, anstatt diese Schleife zu gruppieren und xx Mal pro Kern laufen zu lassen, den ich hatte ... Ty für Ihren Einblick ~ Jetzt weiß ich nur nicht, ob ich Redis oder den internen IPC verwenden soll: P
NiCk Newman
2
Vielen Dank, dass Sie sich mit "Warum" befasst haben - alle Beiträge, die ich bis zu diesem gelesen habe, haben diesen einfachen Teil der Erklärung übersehen.
aaaaaa
@ChrisCM In Ihrer Antwort antworten Sie "..aber führt keinen weiteren Code in Ihrem Knotenprozess aus ..". Bedeutet das, dass der Haupt-Thread wartet und nichts verarbeitet? Wenn JA, was nützt es dann, hier Spawn zu verwenden?
Abhi
9

TLDR

Spawn

Wenn ein Spawn erstellt wird - Erstellt eine Streaming-Schnittstelle zwischen dem übergeordneten und dem untergeordneten Prozess.

Streaming-Schnittstelle bedeutet - Pufferung von Daten im Binärformat inONE TIME

Fork

Wenn eine Gabel erstellt wird - Erstellt einen Kommunikationskanal zwischen dem übergeordneten und dem untergeordneten Prozess

Kommunikationskanal bedeutet - Messaging

Difference

Nun, beide sehen so aus, als würden sie die gleiche Datenübertragung durchführen , außer unter dem Unterschied

spawn ist nützlich, wenn Sie einen kontinuierlichen Datenpuffer im Binär- / Codierungsformat ausführen möchten, z. B. 1 GB Videodatei, Bild, Anmeldedateien übertragenONE TIME

Fork ist nützlich, wenn Sie Messaging durchführen möchten, z. B. JSONoder XMLDaten-Messaging

Conslusion

spawn sollte zum Streaming von Big Data / Dateien / Bildern vom Spawn- Prozess zum übergeordneten Element verwendet werden Prozess verwendet werden

Fork sollte für Json / Xml-Nachrichten verwendet werden.

  • Z.B nehme 10 Gabel Prozess von den Eltern erstellt werden.
  • und jeder Prozess führt eine Operation aus
  • und jeder Prozess nach Abschluss des Vorgangs sendet eine Nachricht an das übergeordnete Element " Prozess Nr. 4 erledigt ", " Prozess Nr. 8 erledigt ".
Vijay
quelle
Was ist mit der kontinuierlichen Protokollierung von Daten vom Elternteil in ein Kind und schließlich in einer Datei?
Esqarrouth
1
@Esqarrouth, müssen Sie identifizieren, ob es sich um einen kontinuierlichen Stream oder um Nachrichten handelt. Und Sie haben das Wort "Continuous Loging" verwendet. Ich glaube, Sie werden an Protokolle (JSON) für Kinder schreiben. Wenn ja, verwenden Sie " FORKelse", wenn Sie einen sehr großen Datenblock haben, der gepuffert werden soll. Verwenden Sie dannSPAWN
vijay
5
  • spawn - child_process.spawn startet einen neuen Prozess mit einem bestimmten Befehl.
  • fork - Die child_process.fork- Methode ist ein Sonderfall von spawn () zum Erstellen untergeordneter Prozesse.

Die spawn () Methode

Die Methode child_process.spawn startet einen neuen Prozess mit einem bestimmten Befehl. Es hat die folgende Signatur -

child_process.spawn(command[, args][, options])

Lesen Sie mehr über Optionen

Die spawn () -Methode gibt Streams (stdout & stderr) zurück und sollte verwendet werden, wenn der Prozess eine Datenmenge zurückgibt. spawn () empfängt die Antwort, sobald der Prozess ausgeführt wird.

Die fork () -Methode

Die child_process.fork- Methode ist ein Sonderfall von spawn () zum Erstellen von Knotenprozessen. Es hat die folgende Signatur -

 child_process.fork(modulePath[, args][, options])

Die Fork-Methode gibt ein Objekt mit einem integrierten Kommunikationskanal zurück und verfügt außerdem über alle Methoden in einer normalen ChildProcess-Instanz.

Igor Litvinovich
quelle