Node.js Spawn vs. Ausführen

Lesezeit: 5 Minuten

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?

Benutzer-Avatar
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.

Einige nützliche Links – DZone Hacksperling

  • 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

Benutzer-Avatar
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)

var interval;
interval = setInterval(function(){
    console.log( 'module data' );
    if(interval._idleStart > 5000) clearInterval(interval);
}, 1000);
  • 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.

    – Rückspiegel

    23. Juni 2021 um 13:31 Uhr

Benutzer-Avatar
André M

Ein guter Ausgangspunkt ist NodeJS Dokumentation.

Für ‘Spawn’ ist der Dokumentationsstatus:

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().

1131010cookie-checkNode.js Spawn vs. Ausführen

Node.js Spawn vs. Ausführen

Lesezeit: 5 Minuten

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?

Benutzer-Avatar
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.

Einige nützliche Links – DZone Hacksperling

  • 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

Benutzer-Avatar
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)

var interval;
interval = setInterval(function(){
    console.log( 'module data' );
    if(interval._idleStart > 5000) clearInterval(interval);
}, 1000);
  • 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.

    – Rückspiegel

    23. Juni 2021 um 13:31 Uhr

Benutzer-Avatar
André M

Ein guter Ausgangspunkt ist NodeJS Dokumentation.

Für ‘Spawn’ ist der Dokumentationsstatus:

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().

1131020cookie-checkNode.js Spawn vs. Ausführen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy