In einem Online-Schulungsvideo, das ich mir ansehe, um Node zu lernen, sagt der Erzähler, dass „Spawn besser für längere Prozesse mit großen Datenmengen ist, während Execute besser für kurze Datenmengen ist“.
Warum ist das? Was ist der Unterschied zwischen den Funktionen child_process spawn und execute in Node.js, und wann weiß ich, welche ich verwenden soll?
Wasyl Moskalow
Der Hauptunterschied ist die spawn eignet sich eher für lang andauernde Prozesse mit großer Leistung. spawn Streams Input/Output mit untergeordnetem Prozess. exec gepufferte Ausgabe in einem kleinen Puffer (standardmäßig 200 KB). Auch wie ich weiß exec spawnen Sie zuerst die Subshell und versuchen Sie dann, Ihren Prozess auszuführen. Um lange Rede kurzer Sinn zu machen spawn falls Sie viele Daten benötigen, die von untergeordneten Prozessen gestreamt werden und exec wenn Sie Funktionen wie Shell Pipes, Redirects oder sogar mehr als ein Programm auf einmal benötigen.
Ich bin auch ein Anfänger von node. Das ist mir beides aufgefallen exec und spawn Rückkehr ChildProcess Objekt. Sagt der Doc spawn Ströme stdout während exec puffert es, also habe ich das versucht: cp.stdout.on("data", ...) bei dem die cp wurde von zurückgegeben exec. Es stellte sich heraus, dass die Daten auch Stück für Stück herausströmten. Ich bin ein bisschen verwirrt.
– Zhu
22. November 2020 um 10:11 Uhr
@Zhou Sie können das zurückgegebene ChildProcess-Objekt verwenden exec ähnlich wie Sie es verwenden würden spawnes würde jedoch den Verwendungszweck zunichte machen exec da diese Funktion die Notwendigkeit abstrahiert, sich mit den Streams zu befassen. Aber hinter den Kulissen sind diese Streams immer noch vorhanden, exec kümmert sich nur darum, die Daten von ihnen für Sie zu sammeln. Was Sie entdeckt haben, ist nur, dass Ihnen diese Streams technisch immer noch zur Verfügung stehen, wenn Sie sie verwenden exec. Allerdings gibt es normalerweise keine wirkliche Notwendigkeit für sie.
– Thomas Watson
12. Januar 2021 um 9:43 Uhr
Pall Arpad
untergeordneter Prozess erstellt von spawn()
spawnt keine Shell
streamt die vom untergeordneten Prozess zurückgegebenen Daten (der Datenfluss ist konstant)
hat keine Größenbeschränkung für die Datenübertragung
untergeordneter Prozess erstellt von exec()
erzeugt eine Shell, in der der übergebene Befehl ausgeführt wird
puffert die Daten (wartet, bis der Prozess schließt und überträgt die Daten in einem Stück)
Die maximale Datenübertragung bis zu Node.js v.12.x betrug 200 KB (standardmäßig), aber da Node.js v.12x auf 1 MB (standardmäßig) erhöht wurde
-main.js (Datei)
var {spawn, exec} = require('child_process');
// 'node' is an executable command (can be executed without a shell)
// uses streams to transfer data (spawn.stout)
var spawn = spawn('node', ['module.js']);
spawn.stdout.on('data', function(msg){
console.log(msg.toString())
});
// the 'node module.js' runs in the spawned shell
// transfered data is handled in the callback function
var exec = exec('node module.js', function(err, stdout, stderr){
console.log(stdout);
});
-module.js (gibt im Grunde 5 Sekunden lang jede Sekunde eine Nachricht zurück, bevor sie beendet wird)
das spawn() Der untergeordnete Prozess gibt die Nachricht zurück module data alle 1 Sekunde für 5 Sekunden, da die Daten „gestreamt“ werden
das exec() Der untergeordnete Prozess gibt nur eine Nachricht zurück module data module data module data module data module data nach 5 Sekunden (wenn der Prozess geschlossen ist) liegt das daran, dass die Daten ‘gepuffert’ sind
Beachten Sie, dass weder die spawn() noch die exec() Untergeordnete Prozesse sind für die Ausführung von Knotenmodulen konzipiert, diese Demo dient nur dazu, den Unterschied zu zeigen (wenn Sie Knotenmodule als untergeordnete Prozesse ausführen möchten, verwenden Sie die fork() Methode statt)
Als Randbemerkung, vermeiden Sie es var spawn = spawn(...) und var exec = exec(...)da dies die Funktionen überschreiben würde.
Die Methode child_process.spawn() erzeugt einen neuen Prozess unter Verwendung des angegebenen Befehls mit Befehlszeilenargumenten in Argumenten. Wenn weggelassen, verwendet args standardmäßig ein leeres Array.
Während für ‘exec’:
Erzeugt eine Shell, führt dann den Befehl innerhalb dieser Shell aus und puffert alle generierten Ausgaben. Die an die exec-Funktion übergebene Befehlszeichenfolge wird direkt von der Shell verarbeitet, und Sonderzeichen (je nach Shell unterschiedlich) müssen entsprechend behandelt werden.
Die Hauptsache scheint zu sein, ob Sie die Ausgabe des Befehls verarbeiten müssen oder nicht, was meiner Meinung nach der Faktor sein könnte, der sich auf die Leistung auswirkt (ich habe nicht verglichen). Wenn Sie sich nur um den Abschluss des Prozesses kümmern, ist ‘exec’ Ihre Wahl. Spawn öffnet Streams für stdout und stderr mit ondata-Ereignissen, exec gibt nur einen Puffer mit stdout und stderr als Strings zurück.
Die letzte Zeile dieser Antwort sollte lauten: Wenn Sie sich nur um den Abschluss des Prozesses kümmern, wäre „exec“ Ihre Wahl. Spawn öffnet Streams für stdout und stderr mit ondata-Ereignissen, exec gibt nur einen Puffer mit stdout und stderr als Strings zurück.
– anneb
14. September 2019 um 11:41 Uhr
Ich argumentiere damit: “Ein guter Ausgangspunkt ist NodeJS”. Ich habe gerade angefangen und konnte die Unterschiede nicht herausfiltern, eine zu große Textwand hat mich hart getroffen. Ich habe über einen gelesen, nach unten gescrollt und vergessen, was ich gelesen habe. Ich weiß, dass RTFM King ist, aber FM gelesen zu werden, sollte humaner sein
– Marecki
17. August 2021 um 14:37 Uhr
Stimmt mit @Marecky überein. Die nodejs-Dokumente sind wie ein Wörterbuch: gute Referenzen für einzelne Elemente, aber schlecht geeignet, um den Unterschied zwischen ähnlichen hervorzuheben.
– hraban
5. September 2021 um 14:56 Uhr
Ein Zitat aus den offiziellen Dokumenten:
Der Bequemlichkeit halber child_process -Modul bietet eine Handvoll synchroner und asynchroner Alternativen zu child_process.spawn() und child_process.spawnSync(). Jede dieser Alternativen wird zusätzlich implementiert child_process.spawn() oder child_process.spawnSync().
11310100cookie-checkNode.js Spawn vs. Ausführenyes
In einem Online-Schulungsvideo, das ich mir ansehe, um Node zu lernen, sagt der Erzähler, dass „Spawn besser für längere Prozesse mit großen Datenmengen ist, während Execute besser für kurze Datenmengen ist“.
Warum ist das? Was ist der Unterschied zwischen den Funktionen child_process spawn und execute in Node.js, und wann weiß ich, welche ich verwenden soll?
Wasyl Moskalow
Der Hauptunterschied ist die spawn eignet sich eher für lang andauernde Prozesse mit großer Leistung. spawn Streams Input/Output mit untergeordnetem Prozess. exec gepufferte Ausgabe in einem kleinen Puffer (standardmäßig 200 KB). Auch wie ich weiß exec spawnen Sie zuerst die Subshell und versuchen Sie dann, Ihren Prozess auszuführen. Um lange Rede kurzer Sinn zu machen spawn falls Sie viele Daten benötigen, die von untergeordneten Prozessen gestreamt werden und exec wenn Sie Funktionen wie Shell Pipes, Redirects oder sogar mehr als ein Programm auf einmal benötigen.
Ich bin auch ein Anfänger von node. Das ist mir beides aufgefallen exec und spawn Rückkehr ChildProcess Objekt. Sagt der Doc spawn Ströme stdout während exec puffert es, also habe ich das versucht: cp.stdout.on("data", ...) bei dem die cp wurde von zurückgegeben exec. Es stellte sich heraus, dass die Daten auch Stück für Stück herausströmten. Ich bin ein bisschen verwirrt.
– Zhu
22. November 2020 um 10:11 Uhr
@Zhou Sie können das zurückgegebene ChildProcess-Objekt verwenden exec ähnlich wie Sie es verwenden würden spawnes würde jedoch den Verwendungszweck zunichte machen exec da diese Funktion die Notwendigkeit abstrahiert, sich mit den Streams zu befassen. Aber hinter den Kulissen sind diese Streams immer noch vorhanden, exec kümmert sich nur darum, die Daten von ihnen für Sie zu sammeln. Was Sie entdeckt haben, ist nur, dass Ihnen diese Streams technisch immer noch zur Verfügung stehen, wenn Sie sie verwenden exec. Allerdings gibt es normalerweise keine wirkliche Notwendigkeit für sie.
– Thomas Watson
12. Januar 2021 um 9:43 Uhr
Pall Arpad
untergeordneter Prozess erstellt von spawn()
spawnt keine Shell
streamt die vom untergeordneten Prozess zurückgegebenen Daten (der Datenfluss ist konstant)
hat keine Größenbeschränkung für die Datenübertragung
untergeordneter Prozess erstellt von exec()
erzeugt eine Shell, in der der übergebene Befehl ausgeführt wird
puffert die Daten (wartet, bis der Prozess schließt und überträgt die Daten in einem Stück)
Die maximale Datenübertragung bis zu Node.js v.12.x betrug 200 KB (standardmäßig), aber da Node.js v.12x auf 1 MB (standardmäßig) erhöht wurde
-main.js (Datei)
var {spawn, exec} = require('child_process');
// 'node' is an executable command (can be executed without a shell)
// uses streams to transfer data (spawn.stout)
var spawn = spawn('node', ['module.js']);
spawn.stdout.on('data', function(msg){
console.log(msg.toString())
});
// the 'node module.js' runs in the spawned shell
// transfered data is handled in the callback function
var exec = exec('node module.js', function(err, stdout, stderr){
console.log(stdout);
});
-module.js (gibt im Grunde 5 Sekunden lang jede Sekunde eine Nachricht zurück, bevor sie beendet wird)
das spawn() Der untergeordnete Prozess gibt die Nachricht zurück module data alle 1 Sekunde für 5 Sekunden, da die Daten „gestreamt“ werden
das exec() Der untergeordnete Prozess gibt nur eine Nachricht zurück module data module data module data module data module data nach 5 Sekunden (wenn der Prozess geschlossen ist) liegt das daran, dass die Daten ‘gepuffert’ sind
Beachten Sie, dass weder die spawn() noch die exec() Untergeordnete Prozesse sind für die Ausführung von Knotenmodulen konzipiert, diese Demo dient nur dazu, den Unterschied zu zeigen (wenn Sie Knotenmodule als untergeordnete Prozesse ausführen möchten, verwenden Sie die fork() Methode statt)
Als Randbemerkung, vermeiden Sie es var spawn = spawn(...) und var exec = exec(...)da dies die Funktionen überschreiben würde.
Die Methode child_process.spawn() erzeugt einen neuen Prozess unter Verwendung des angegebenen Befehls mit Befehlszeilenargumenten in Argumenten. Wenn weggelassen, verwendet args standardmäßig ein leeres Array.
Während für ‘exec’:
Erzeugt eine Shell, führt dann den Befehl innerhalb dieser Shell aus und puffert alle generierten Ausgaben. Die an die exec-Funktion übergebene Befehlszeichenfolge wird direkt von der Shell verarbeitet, und Sonderzeichen (je nach Shell unterschiedlich) müssen entsprechend behandelt werden.
Die Hauptsache scheint zu sein, ob Sie die Ausgabe des Befehls verarbeiten müssen oder nicht, was meiner Meinung nach der Faktor sein könnte, der sich auf die Leistung auswirkt (ich habe nicht verglichen). Wenn Sie sich nur um den Abschluss des Prozesses kümmern, ist ‘exec’ Ihre Wahl. Spawn öffnet Streams für stdout und stderr mit ondata-Ereignissen, exec gibt nur einen Puffer mit stdout und stderr als Strings zurück.
Die letzte Zeile dieser Antwort sollte lauten: Wenn Sie sich nur um den Abschluss des Prozesses kümmern, wäre „exec“ Ihre Wahl. Spawn öffnet Streams für stdout und stderr mit ondata-Ereignissen, exec gibt nur einen Puffer mit stdout und stderr als Strings zurück.
– anneb
14. September 2019 um 11:41 Uhr
Ich argumentiere damit: “Ein guter Ausgangspunkt ist NodeJS”. Ich habe gerade angefangen und konnte die Unterschiede nicht herausfiltern, eine zu große Textwand hat mich hart getroffen. Ich habe über einen gelesen, nach unten gescrollt und vergessen, was ich gelesen habe. Ich weiß, dass RTFM King ist, aber FM gelesen zu werden, sollte humaner sein
– Marecki
17. August 2021 um 14:37 Uhr
Stimmt mit @Marecky überein. Die nodejs-Dokumente sind wie ein Wörterbuch: gute Referenzen für einzelne Elemente, aber schlecht geeignet, um den Unterschied zwischen ähnlichen hervorzuheben.
– hraban
5. September 2021 um 14:56 Uhr
Ein Zitat aus den offiziellen Dokumenten:
Der Bequemlichkeit halber child_process -Modul bietet eine Handvoll synchroner und asynchroner Alternativen zu child_process.spawn() und child_process.spawnSync(). Jede dieser Alternativen wird zusätzlich implementiert child_process.spawn() oder child_process.spawnSync().
11310200cookie-checkNode.js Spawn vs. Ausführenyes