Gibt es eine Möglichkeit, Threads zu erstellen, um mehrere Methoden gleichzeitig auszuführen. Wenn eine Methode dazwischen fehlschlägt, sollten alle anderen Threads beendet werden.
Danke im Voraus
Jeder node.js-Prozess ist von Entwurf aus ein einzelner Thread. Um mehrere Threads zu erhalten, müssen Sie über mehrere Prozesse verfügen. (Wie einige andere Poster bereits erwähnt haben, gibt es auch Bibliotheken, zu denen Sie eine Verknüpfung herstellen können. Dadurch können Sie mit Threads in Node arbeiten. Diese Bibliotheken sind jedoch ohne diese Funktion nicht möglich Siehe Antwort von Shawn Vincent unter Bezugnahme auf https://github.com/audreyt/node-webworker-threads )
Sie können untergeordnete Prozesse von Ihrem Hauptprozess aus starten, wie hier in der Dokumentation zu node.js gezeigt: http://nodejs.org/api/child_process.html . Die Beispiele sind auf dieser Seite ziemlich gut und recht einfach.
Ihr übergeordneter Prozess kann dann nach dem Abschlussereignis in jedem Prozess suchen, den er gestartet hat, und dann die Schließung der anderen Prozesse erzwingen, um den Typ einer Fail-Stop-Strategie zu erreichen, über die Sie sprechen.
Siehe auch: Node.js auf Multi-Core-Maschinen
Es gibt auch mindestens eine Bibliothek für das native Threading in Node.js: node-webworker-thread
https://github.com/audreyt/node-webworker-threads
Dies implementiert im Wesentlichen die Web Worker Browser-API für node.js.
Ab Knoten 10.5 gibt es jetzt Unterstützung für Multi-Threading , aber es ist experimental. Ich hoffe, dass dies bald stabil wird.
Überprüfen Sie die folgenden Ressourcen:
Mit Napa.js können Sie Multithreading erhalten.
https://github.com/Microsoft/napajs
"Napa.js ist eine auf V8 basierende Multi-Threaded-JavaScript-Laufzeitumgebung, die ursprünglich entwickelt wurde, um hoch iterative Services mit uneingeschränkter Leistung in Bing zu entwickeln. Bei ihrer Weiterentwicklung ist es sinnvoll, Node.js in CPU-gebundenen Aufgaben zu ergänzen mit der Fähigkeit, JavaScript in mehreren V8-Isolaten auszuführen und zwischen diesen zu kommunizieren. Napa.js wird als Node.js-Modul verfügbar gemacht, während es auch ohne die Abhängigkeit von Node.js in einen Host-Prozess eingebettet werden kann. "
Wenn Sie Rx verwenden, ist es ziemlich einfach, das Plugin in RXJS-Cluster einzubinden, um die Arbeit in parallele Ausführung zu unterteilen. (Haftungsausschluss: Ich bin der Autor)
Es gibt auch jetzt https://github.com/xk/node-threads-a-gogo , obwohl ich nicht sicher bin, was den Projektstatus betrifft.
Ich brauchte real Multithreading in Node.js und was für mich funktionierte war das Threads Paket. Es erzeugt einen anderen Prozess mit einer eigenen Node.js-Nachrichtenschleife, sodass sie sich nicht gegenseitig blockieren. Das Setup ist einfach und die Dokumentation macht Sie schnell einsatzbereit. Ihr Hauptprogramm und die Worker können auf beide Arten kommunizieren, und Worker-Threads können bei Bedarf beendet werden.
Da Multithreading und Node.js ein kompliziertes und viel diskutiertes Thema sind, war es ziemlich schwierig, ein Paket zu finden, das für my spezifische Anforderungen geeignet ist. Für die Aufzeichnung arbeiteten diese nicht für mich :
require
- Module in Workern, die ich brauchteUnd für diejenigen, die sich fragen, warum ich real Multithreading brauchte: Für eine Anwendung, die den Raspberry Pi und Interrupts einbezieht. Ein Thread behandelt diese Interrupts und ein anderer kümmert sich um das Speichern der Daten (und mehr).
NodeJS enthält jetzt threads (als experimentelles Feature zum Zeitpunkt der Beantwortung).
Sie suchen möglicherweise nach Promise.race
(native E/A-Rennlösung, keine Threads)
Angenommen, Sie (oder andere, die diese Frage durchsuchen) möchten Threads laufen lassen, um Fehler zu vermeiden und die Kosten für E/A-Vorgänge zu vermeiden, ist dies eine einfache und native Methode, dies zu erreichen (die keine Threads verwendet). Der Knoten ist als Singlethreading konzipiert (siehe Ereignisschleife). Vermeiden Sie daher die Verwendung von Threads. Wenn meine Annahme richtig ist, empfehle ich die Verwendung von Promise.race
mit setTimeout
(Beispiel im Link). Mit dieser Strategie würden Sie eine Liste von Versprechen ablaufen lassen, die jeweils einige E/A-Vorgänge ausführen, und das Versprechen ablehnen, wenn ein Fehler vorliegt (andernfalls Timeout). Die Promise.race
-Anweisung wird nach der ersten Auflösung/Ablehnung fortgesetzt, was scheinbar Ihren Wünschen entspricht. Hoffe das hilft jemandem!
Das Release 10.5.0 von nodejs hat Multithreading in Node.js angekündigt . Die Funktion ist noch experimentell. Es gibt jetzt ein neues worker_threads Modul.
Sie können Worker-Threads verwenden, wenn Sie Node.js v10.5.0 oder höher ausführen. Dies ist jedoch eine experimentelle API . Es ist nicht standardmäßig verfügbar: Sie müssen es aktivieren, indem Sie - experimental-worker verwenden, wenn Sie Node.js aufrufen.
Hier ist ein Beispiel, bei dem ES6 und worker_threads aktiviert und in Version 12.3.1 getestet wurden
//package.json
"scripts": {
"start": "node --experimental-modules --experimental- worker index.mjs"
},
Jetzt müssen Sie Worker aus worker_threads importieren. Hinweis: Sie müssen Ihre js -Dateien mit der Erweiterung '. Mjs für die ES6-Unterstützung deklarieren.
//index.mjs
import { Worker } from 'worker_threads';
const spawnWorker = workerData => {
return new Promise((resolve, reject) => {
const worker = new Worker('./workerService.mjs', { workerData });
worker.on('message', resolve);
worker.on('error', reject);
worker.on('exit', code => code !== 0 && reject(new Error(`Worker stopped with
exit code ${code}`)));
})
}
const spawnWorkers = () => {
for (let t = 1; t <= 5; t++)
spawnWorker('Hello').then(data => console.log(data));
}
spawnWorkers();
Schließlich erstellen wir eine workerService.mjs
//workerService.mjs
import { workerData, parentPort, threadId } from 'worker_threads';
// You can do any cpu intensive tasks here, in a synchronous way
// without blocking the "main thread"
parentPort.postMessage(`${workerData} from worker ${threadId}`);
Ausgabe:
npm run start
Hello from worker 4
Hello from worker 3
Hello from worker 1
Hello from worker 2
Hello from worker 5
Node.js verwendet kein Threading. Laut seinem Erfinder ist dies ein Schlüsselmerkmal. Zum Zeitpunkt seiner Erfindung waren die Fäden langsam, problematisch und schwierig. Node.js wurde als Ergebnis einer Untersuchung einer effizienten Single-Core-Alternative erstellt. Die meisten Node.js-Enthusiasten zitieren immer noch Ihre alten Argumente, als ob die Threads in den letzten 50 Jahren nicht verbessert wurden.
Wie Sie wissen, wird zur Ausführung von JavaScript Node.js verwendet. Die JavaScript-Sprache hat sich auch im Laufe der Jahre entwickelt. Es gibt jetzt Möglichkeiten, mehrere Kerne zu verwenden - d. H., Was Threads tun. Durch Verbesserungen in JavaScript können Sie also in Ihren Anwendungen einige Multi-Core-Multitasking-Aufgaben ausführen. user158 weist darauf hin, dass Node.js ein bisschen damit spielt. Ich weiß nichts davon. Aber warum warten Sie, bis Node.js das, was JavaScript zu bieten hat, genehmigt.
Google für JavaScript-Multithreading anstelle von Node.js-Multithreading. Sie erfahren etwas über Web Workers, Versprechungen und andere Dinge.