So erstellen Sie Threads in nodejs

91

Gibt es eine Möglichkeit, Threads zum gleichzeitigen Ausführen mehrerer Methoden zu erstellen?

Auf diese Weise sollten alle anderen Threads beendet werden, wenn eine Methode zwischen allen anderen Threads fehlschlägt.

user87267867
quelle

Antworten:

94

Jeder node.js-Prozess ist vom Design her ein einzelner Thread. Um mehrere Threads zu erhalten, müssen Sie mehrere Prozesse haben (Wie einige andere Poster bereits erwähnt haben, gibt es auch Bibliotheken, auf die Sie verlinken können, damit Sie mit Threads in Node arbeiten können. Ohne diese Bibliotheken gibt es jedoch keine solche Funktion 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 auf dieser Seite sind ziemlich gut und ziemlich einfach.

Ihr übergeordneter Prozess kann dann bei jedem gestarteten Prozess auf das Abschlussereignis achten und dann das Schließen der anderen Prozesse erzwingen, die Sie gestartet haben, um den Typ einer Fail-All-Stop-Strategie zu erreichen, über die Sie sprechen.

Siehe auch: Node.js auf Mehrkernmaschinen

Brian
quelle
Prozesse können gleichzeitig parallel und sequentiell ablaufen?
user87267867
2
Die untergeordneten Prozesse sind unabhängig vom übergeordneten Prozess. Sie haben ihren eigenen Speicherplatz, ihre eigene PID und ihre eigene Ausführungszeit. Sie sind sich nicht sicher, was Sie unter sequentiell verstehen, aber ja, sie werden parallel ausgeführt und vom Betriebssystem separat für die Ausführung geplant.
Brian
Wie rufe ich benutzerdefinierte Funktionen als untergeordneten Prozess auf?
user87267867
Wie kann ich einen
untergeordneten
2
Huh, war sich dieser Bibliothek nicht bewusst, aber es sieht so aus, als könnten Sie laut Alex Mills Kommentar einige Threading-Arbeiten in Node ausführen. Davon abgesehen ist die nächste Frage, sollten Sie. . . Node wurde von Grund auf entwickelt, um Programmierer von der Komplexität zu befreien, die mit Threads einhergeht, aber eine ähnliche Leistung für das Blockieren von E / A bietet. Ich werde meine Antwort bearbeiten, um der Tatsache Rechnung zu tragen, dass es möglich ist, die referenzierte Bibliothek zu verwenden.
Brian
34

Es gibt auch mindestens eine Bibliothek für das native Threading in Node.js: Node-Webworker-Threads

https://github.com/audreyt/node-webworker-threads

Dies implementiert im Wesentlichen die Web Worker-Browser-API für node.js.

Shawn Vincent
quelle
3
das sollte richtig sein. Die Antwort, dass der Knoten nur Prozesse, aber keine Threads erzeugen kann, ist falsch.
Alexander Mills
9

Sie können Multithreading mit Napa.js erhalten.

https://github.com/Microsoft/napajs

"Napa.js ist eine auf V8 basierende JavaScript-Laufzeit mit mehreren Threads, die ursprünglich für die Entwicklung hoch iterativer Dienste mit kompromissloser Leistung in Bing entwickelt wurde. Im Laufe der Entwicklung finden wir es nützlich, Node.js in CPU-gebundenen Aufgaben zu ergänzen Napa.js wird als Node.js-Modul verfügbar gemacht und kann auch ohne Node.js-Abhängigkeit in einen Host-Prozess eingebettet werden. "

shmuli
quelle
3

Ich brauchte echtes Multithreading in Node.js und was für mich funktionierte, war das Thread- Paket. Es wird ein anderer Prozess mit einer eigenen Node.js-Nachrichtenschleife erzeugt, sodass sie sich nicht gegenseitig blockieren. Das Setup ist einfach und die Dokumentation bringt Sie schnell zum Laufen. Ihr Hauptprogramm und die Mitarbeiter können auf beide Arten kommunizieren, und die "Threads" der Mitarbeiter 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 meine spezifischen Anforderungen geeignet ist. Für die Aufzeichnung funktionierten diese für mich nicht :

  • winziger Arbeiter erlaubte das Laichen von Arbeitern, aber sie schienen dieselbe Nachrichtenschleife zu teilen (aber es könnte sein, dass ich etwas falsch gemacht habe - Threads hatten mehr Dokumentation, was mir das Vertrauen gab, dass es wirklich mehrere Prozesse verwendete, also ging ich weiter, bis es funktionierte).
  • Webworker-Threads erlaubten keine requireModule in Workern , die ich brauchte

Und für diejenigen, die fragen, warum ich echtes Multithreading benötige : Für eine Anwendung mit Raspberry Pi und Interrupts. Ein Thread behandelt diese Interrupts und ein anderer kümmert sich um das Speichern der Daten (und mehr).

Heinrich Ulbricht
quelle
1
Ich schätze den großartigen Gedanken, der in diese Antwort gesteckt wurde!
MLissCetrus
3

Die Version 10.5.0 von nodejs hat Multithreading in Node.js angekündigt . Die Funktion ist noch experimentell. Es ist jetzt ein neues Worker_Threads- Modul verfügbar.

Sie können Worker-Threads verwenden, wenn Sie Node.js 10.5.0 oder höher ausführen. Dies ist jedoch eine experimentelle API . Es ist standardmäßig nicht verfügbar: Sie müssen es mit  --experimental-worker aktivieren, wenn Sie Node.js aufrufen.

Hier ist ein Beispiel mit aktiviertem ES6 und worker_threads , das in Version 12.3.1 getestet wurde

//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
priyeshdkr
quelle
2
Ist das Ihr Artikel: blog.logrocket.com/… ?
serv-inc
Nein ... es ist nicht ... Ich habe es jedoch in der Zeit zurückverfolgt.
Priyeshdkr
2

NodeJS enthält jetzt Threads (als experimentelle Funktion zum Zeitpunkt der Beantwortung).

James Holmes
quelle
0

Möglicherweise suchen Sie nach Promise.race(nativer E / A-Rennlösung, keine Threads)

Angenommen, Sie (oder andere, die diese Frage suchen) möchten Threads ausführen, um Fehler zu vermeiden und die Kosten für E / A-Vorgänge zu vermeiden. Dies ist eine einfache und native Methode, um dies zu erreichen (ohne Threads). Der Knoten ist für Single-Threads ausgelegt (siehe Ereignisschleife). Vermeiden Sie daher nach Möglichkeit die Verwendung von Threads. Wenn meine Annahme richtig ist, empfehle ich die Verwendung Promise.racemit setTimeout(Beispiel im Link). Mit dieser Strategie würden Sie eine Liste von Versprechungen erstellen, die jeweils eine E / A-Operation versuchen, und das Versprechen ablehnen, wenn ein Fehler auftritt (andernfalls Zeitüberschreitung). Die Promise.raceAussage wird nach der ersten Auflösung / Ablehnung fortgesetzt, was genau das zu sein scheint, was Sie wollen. Hoffe das hilft jemandem!

Smileham
quelle
2
Das hat nichts mit Threads zu tun. Sie laufen alle im selben Thread.
Evan Carroll
@EvanCarroll - Danke, dass Sie mich darauf aufmerksam gemacht haben, dass ich nicht klar genug war. Ich habe ihm die Annahme vorangestellt, warum jemand nach Thread-Rennen sucht, und festgestellt, dass dies Versprechen in der Ereignisschleife von Node verwendet. Wenn Sie aus einer anderen Sprache kommen, ist es sehr wahrscheinlich, dass Sie das erreichen möchten, was Threads tun, aber noch nicht mit der Ereignisschleife oder den Versprechungen vertraut sind. Ich wollte darauf hinweisen, dass es einfachere Möglichkeiten gibt, dies zu erreichen, wenn dies Ihr Ziel ist. Ich habe eine Klammer hinzugefügt, dass hier keine Threads verwendet werden. Lassen Sie mich wissen, ob dies die Dinge klärt.
Smileham
Es scheint auch die OP-Kriterien zu beantworten: "Wenn eine Methode zwischen allen anderen Threads fehlschlägt, sollte sie beendet werden", also dachte ich, dass sie relevant ist.
Smileham
Promise.race führt alle Versprechen nacheinander aus und wechselt bei einer asynchronen Operation von einer zur anderen (oder wartet bei einer asynchronen Funktion).
Nagabhushan Baddi
0

Node.js verwendet kein Threading. Laut seinem Erfinder ist das ein Schlüsselmerkmal. Zum Zeitpunkt der 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 das alte Argument, als ob die Threads in den letzten 50 Jahren nicht verbessert worden wären.

Wie Sie wissen, wird Node.js zum Ausführen von JavaScript verwendet. Die JavaScript-Sprache hat sich im Laufe der Jahre ebenfalls entwickelt. Es gibt jetzt Möglichkeiten, mehrere Kerne zu verwenden - dh was Threads tun. Durch die Weiterentwicklung von JavaScript können Sie in Ihren Anwendungen Multi-Core-Multitasking durchführen. user158 weist darauf hin, dass Node.js ein bisschen damit spielt. Ich weiß nichts darüber. Aber warum warten Sie, bis Node.js das Angebot von JavaScript genehmigt hat?

Google für JavaScript-Multithreading anstelle von Node.js Multithreading. Sie erfahren mehr über Web Worker, Versprechen und andere Dinge.

Roger F. Gay
quelle