2016-05-16 26 views
3

Ich benutze Nodejs für eine CPU-intensive Aufgabe, die im Grunde eine große Menge an Daten generiert und speichert sie in einer Datei. Ich streame die Daten in Ausgabedateien, wie sie für einen einzelnen Datentyp generiert werden.Nodejs Parallele Programmierung mit Threads

Ziel: Ich möchte diese Daten für mehrere Arten von Daten parallel, um die Aufgabe machen zur Erzeugung .Ohne jeder Prozess (meine Multi-Core-CPU, um seine beste Verwendung) einen eigenen Heap-Speicher mit .So mit der Bereitstellung von größerer Prozessspeicher und höhere Ausführungsgeschwindigkeit.

Ich plane Knoten fibers zu verwenden, die auch durch meteor js für seine eigene Callback verwendet wird handling.But Ich bin nicht sicher, ob dies zu erreichen, was ich will, wie in einem der video on meteor fibers by Chris Mather am Ende erwähnt, die schließlich alles Single-Threaded- und Node-Fasern verwalten die gleiche Single-Thread-Ereignisschleife, um ihre Funktionalität bereitzustellen.

So

  • Bedeutet dies, dass, wenn ich Knoten Fasern verwenden würde nicht ich meine Aufgabe in parallel laufen, also nicht meinen CPU-Kern nutzen?

  • Hat Knoten webworker-threads wird mir helfen bei der Erreichung der Funktionalität I desire.As auf Module Homepage erwähnt wird, die sagt, dass, Webworker Threads auf seperate/Parallel-CPU Prozess ausgeführt wird, so dass Multi-Threading in Echt Bereitstellung Sinn?

  • Als endende Frage, Bedeutet dies, dass node.js für solche CPU-intensive Aufgaben nicht ratsam ist?

Anmerkung: Ich mag nicht asynchrone Code Strukturierung Libs verwenden, die als Themen präsentiert werden, aber infact nur syntatical Zucker über denselben Asynchron-Code hinzufügen, da die Aufgaben bereits verwendet weitgehend CPU-Kapazität .I sind Asynchron-Fähigkeiten bis max.

// Update 1 (basierend auf Antwort für Cluster)

Leider habe ich zu erwähnen vergessen, aber Problem mit Clustern, die ich gegenüber:

  • Complex um die Menge zu Lastenausgleich der Arbeit habe ich in einer Weise, die sicherstellt, dass eine bestimmte Menge von parallelen Aufgaben vor bestimmten anderen Aufgaben ausgeführt wird.

  • Nicht sicher, ob Cluster wirklich tun, was ich will, die sich auf these lines on webworker-threads npm Homepage

Das „kann nicht die Ereignisschleife blockieren“ Problem ist inhärent Knoten des evented Modell. Unabhängig davon, wie viele Knotenprozesse Sie als Knoten-Cluster ausführen, werden die Probleme mit CPU-gebundenen Aufgaben nicht gelöst.

..... irgendein Licht auf, wie ..whouldfelp hilfreich sein würde.

Antwort

3

Anstatt zu versuchen, mehrere Threads zu implementieren, sollten Sie es einfacher finden, mehrere Prozesse mit Node zu verwenden.js

Siehe zum Beispiel das cluster Modul. Dadurch können Sie den gleichen js-Code in mehreren Prozessen, z. ein pro Kern, und sammeln Sie ihre Ergebnisse/benachrichtigt werden, sobald sie abgeschlossen sind.

Wenn Cluster mehr als Sie benötigt, können Sie auch einfach fork anrufen.


Wenn Sie Thread-Parallelität nicht prozess- haben müssen, dann können Sie an das Schreiben eines async native Modul zu suchen. Dann haben Sie Zugriff auf den libuv-Thread-Pool (auch wenn es hungrig ist, kann es die I/O-Leistung reduzieren) oder können Ihre eigenen Threads nach Belieben ausschneiden (aber dann sind Sie allein für die Synchronisation mit dem Rest von Node).


Nach Update 1

Für Lastenausgleich, wenn das, was Cluster tut, ist nicht für Sie arbeiten, dann können Sie einfach tun Sie es sich mit Gabel, wie ich bereits erwähnt. Die Quelle für den Cluster ist verfügbar.

Für den anderen Punkt bedeutet es, wenn die Aufgabe wirklich CPU-gebunden ist, gibt es keinen Vorteil Node wird Ihnen über andere Technologien geben, außer einfacher zu sein, wenn alles andere Knoten verwendet. Die einzige Option, die Sie haben, ist sicherzustellen, dass Sie alle verfügbaren CPU-Ressourcen verwenden, die Ihnen ein Worker-Pool zur Verfügung stellt. Wenn Sie bereits Node verwenden, verwenden Sie am einfachsten die bereits vorhandenen (Cluster oder libuv). Wenn sie nicht ausreichen, dann musst du etwas anderes finden.

Unabhängig von der Technologie bleibt es wahr, dass Multi-Prozess-Parallelität viel einfacher ist als Multi-Thread-Parallelität.

Hinweis: Trotz allem, was Sie sagen, möchten Sie Async-Code unbedingt verwenden, weil er CPI-intensiv ist. Andernfalls blockieren Ihre Tasks alle E/A. Du willst nicht, dass das passiert.

+0

Bitte schauen Sie sich die aktualisierte Frage an, die ich vergessen habe zu erwähnen ... – damitj07

+0

Bedeutet das, dass es keine Bibliothek gibt, die multi-threaded Parallelität in Node..as im Vergleich zu anderen Technologien – damitj07

+0

Es gibt, aber in vielen die Meinung der Leute, sie sind eine sehr schlechte Idee. JavaScript ist dafür nicht gedacht. – OrangeDog

Verwandte Themen