web-dev-qa-db-de.com

So erstellen Sie Threads in nodejs

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

76
user87267867

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

85
Brian

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.

32
Shawn Vincent

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:

11
user158

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. "

7
shmuli

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)

https://www.npmjs.com/package/rxjs-cluster

4
Jonathan Dunlap

Es gibt auch jetzt https://github.com/xk/node-threads-a-gogo , obwohl ich nicht sicher bin, was den Projektstatus betrifft.

2
shaunc

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 :

  • tiny-worker erlaubte das Laichen von Arbeitern, aber sie schienen die gleiche Nachrichtenschleife zu haben (aber es könnte sein, dass ich etwas falsch gemacht habe - threads hatte mehr Dokumentation, die mir das Vertrauen gab really benutzte mehrere Prozesse, also machte ich weiter, bis es funktionierte)
  • Webworker-Threads erlaubte keine require- Module in Workern, die ich brauchte

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

2

NodeJS enthält jetzt threads (als experimentelles Feature zum Zeitpunkt der Beantwortung).

2
James Holmes

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!

1
smileham

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
1
Priyesh Diukar

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.

0
Roger F. Gay