2013-07-25 7 views
111

Dies mag wie eine grundlegende Frage scheinen, aber ich konnte keine Dokumentation nicht finden:node.js Kind-Prozess - Unterschied zwischen Laich & Gabel

Was ist der Unterschied zwischen & Forking einen node.js Prozess Laichen? Ich habe gelesen, dass Gabelung ein spezieller Fall des Laichens ist, aber was sind die verschiedenen Anwendungsfälle/Wiederholungen für die Verwendung von jedem von ihnen?

Antwort

165

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

Fork ist eine spezielle Instanz des Spawns, die eine neue Instanz des V8-Engine ausführt. Das bedeutet, dass Sie im Wesentlichen mehrere Worker erstellen können, die auf genau der gleichen Node-Codebasis oder vielleicht einem anderen Modul für eine bestimmte Aufgabe ausgeführt werden. Dies ist besonders nützlich, um einen Worker-Pool zu erstellen. Während das asynchrone Knotenereignismodell es ermöglicht, einen einzelnen Kern einer Maschine ziemlich effizient zu verwenden, erlaubt es einem Knotenprozess nicht, Multi-Core-Maschinen zu verwenden. Der einfachste Weg, dies zu erreichen, besteht darin, mehrere Kopien desselben Programms auf einem einzigen Prozessor auszuführen. Eine gute Faustregel sind ein bis zwei Knotenprozesse pro Kern, vielleicht mehr für Maschinen mit einem guten Takt/Takt-Verhältnis, oder für Knotenprozesse, die schwer sind für I/O und wenig CPU-Arbeit, um das zu minimieren Ausfallzeit wartet die Ereignisschleife 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 vieler Prozesse/Kernsätze entspricht. Sie können die Leistung verringern, indem Sie zu viele Mitarbeiter für Ihre Maschine/Ihr Szenario generieren.

Letztendlich könnten Sie spawn in einer Weise verwenden, die das obige tat, indem Sie spawn einen Node-Befehl senden. Aber das wäre albern, weil fork einige Dinge tut, um den Prozess der Erstellung von V8-Instanzen zu optimieren. Nur um es klar zu machen, dass das Spawn schließlich Gabel umfasst. Gabel ist nur optimal für diesen speziellen und sehr nützlichen Anwendungsfall.

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

+0

Dank @ChrisCM, die meine Zweifel – Hitesh

+0

@ChrisCM gelöscht, wenn ich das verwenden lassen sagen 'var child = require ('child_process') Gabel ('child.js.');' Zum Beispiel auf meinem Haupt-App, ich werde jetzt 2 separate Kerne laufen haben. Wenn ich eine ** schwere ** for-Schleife in der child.js (Prozess) ausführen würde, würde ich im Wesentlichen mehr Kerne verwenden, um child.js anzutreiben, richtig? Würde diese CPU-Nutzung meinen Haupt-App-Kern beeinflussen? –

+2

Es ist unmöglich, irgendetwas auf einer CPU zu tun, ohne andere Dinge zu bewirken. Scheduling, gemeinsame Cache-Nutzung, BUS-Verkehr, etc. Es sollte jedoch einen separaten Kern nutzen und Ihre Hauptlaufschleife MOSTLY unberührt lassen. Wie in, nicht die schwerwiegenden negativen Auswirkungen, die Sie erwarten würden, zwei Prozesse auf dem gleichen Single-Core-Prozessor zu haben. An diesem Punkt ist es wirklich an der Betriebssystem- und Hardwarekonfiguration, richtig zu optimieren. Verschiedene Einstellungen können zu unterschiedlichen Ergebnissen führen. – ChrisCM