Webworker-threads: Ist es OK, "require" in worker zu verwenden?

8

(mit Sails.js)

Ich teste Webworker-Threads ( Ссылка ) für lange laufende Prozesse auf Node und das folgende Beispiel sieht gut aus :

%Vor%

Aber sobald ich irgendeinen Code hinzufüge, um Mongodb abzufragen, löst er eine Ausnahme aus: (Verwenden Sie nicht das Sails-Modell in der Abfrage, nur um sicherzustellen, dass der Code eigenständig ausgeführt werden kann - db hat kein Kennwort)

%Vor%

Da der DB-Code außerhalb des Worker einwandfrei funktioniert, glaube ich, dass er etwas mit require zu tun hat. Ich habe etwas versucht, das auch außerhalb des Worker funktioniert, wie

%Vor%

Und der Code löst auch eine Ausnahme aus. Leider zeigt console.log dies nur für alle Arten von Fehlern an:

%Vor%

Die Fragen lauten also: Gibt es Einschränkungen oder Richtlinien für die Verwendung in einem Worker? Was könnte ich hier falsch machen?

AKTUALISIEREN

es scheint, Threads erlauben keine externen Module Ссылка

  

TL: DR Ich denke, wenn Sie benötigen, sollten Sie einen Knoten verwenden   Cluster- oder Kindprozess. Wenn Sie etwas cpu beschäftigte Arbeit abladen möchten,   du solltest tagg und die load-funktion nutzen, um dir irgendwelche helfer zu holen   brauche.

Nachdem ich diesen Thread gelesen habe, sehe ich, dass diese Frage der folgenden ähnelt: Load Nodejs Module in einen Web Worker

laden

Zu welcher Audreyt, der Webworker-Thread-Autor geantwortet hat:

  

Autor von Webworker-Threads hier. Danke für die Benutzung des Moduls!

     

Es gibt ein standardmäßiges natives_fs_ Objekt mit dem readFileSync, das Sie verwenden können   um Dateien zu lesen.

     

Darüber hinaus habe ich mich hauptsächlich auf onejs verlassen, um alle benötigten zu kompilieren   Module in package.json in eine einzige JS-Datei für importScripts nach   verwenden, genau wie bei der Bereitstellung für einen clientseitigen Web-Worker   Umgebung. (Es gibt auch viele Alternativen zu onejs - browserify,   usw.)

     

Hoffe, das hilft!

So scheint es importScripts ist der Weg zu gehen. Aber zu diesem Zeitpunkt könnte es zu hacky sein, was ich tun möchte, also ist KUE wahrscheinlich eine ausgereiftere Lösung.

    
noderman 20.06.2015, 03:34
quelle

1 Antwort

6

Ich bin Mitarbeiter des node-webworker-threads Projekts.

Sie können nicht require in node-webworker-threads

Sie haben in Ihrem Update Recht: node-webworker-threads unterstützt (momentan) nicht require externe Module.

Es hat nur begrenzte Unterstützung für einige der integrierten Funktionen, einschließlich Dateisystemaufrufen und einer Version von console.log . Wie Sie festgestellt haben, ist die in console.log implementierte Version von node-webworker-threads nicht identisch mit der eingebauten console.log in Node.js; es macht zum Beispiel nicht automatisch nette String-Repräsentationen der Komponenten eines Objekts.

In einigen Fällen können Sie externe Module verwenden, wie von audreyt in ihrer Antwort beschrieben. Natürlich ist das nicht ideal, und ich sehe die unvollständige require als primären "Dealbreaker" von node-webworker-threads . Ich hoffe, dass ich diesen Sommer daran arbeiten kann.

Wann wird node-webworker-threads verwendet?

Mit

node-webworker-threads können Sie Code für die WebWorker-API erstellen und denselben Code im Client (Browser) und auf dem Server (Node.js) ausführen. Deshalb würden Sie node-webworker-threads über node-threads-a-gogo verwenden.

node-webworker-threads ist großartig, wenn Sie möchten, dass die leichtesten JavaScript-basierten Worker etwas CPU-gebunden machen. Beispiele: Primzahlen, Fibonacci, eine Monte-Carlo-Simulation, die integrierte, aber potentiell teure Operationen wie die reguläre Ausdrücke-Anpassung auslagern.

Wenn nicht verwendet wird, um node-webworker-threads zu verwenden

node-webworker-threads betont die Portabilität gegenüber der Bequemlichkeit. Für eine Node.js-only-Lösung bedeutet dies, dass node-webworker-threads nicht der richtige Weg ist.

Wenn Sie Kompromisse bei der Portabilität von Fullstacks eingehen möchten, gibt es zwei Möglichkeiten: Geschwindigkeit und Komfort.

Versuchen Sie für Geschwindigkeit ein C ++ - Add-on . Benutze NaN . Ich empfehle Scott Frees C ++ und Node.js Integration Buch, um zu lernen, wie man das macht, es wird Ihnen viel Zeit sparen. Sie werden dafür bezahlen, dass Sie Ihre C ++ - Kenntnisse auffrischen müssen, und wenn Sie mit MongoDB arbeiten möchten, ist das wahrscheinlich keine gute Idee.

Verwenden Sie für Komfort einen untergeordneten Prozess -basierten Workerpool wie forschen-pool . In diesem Fall ist jeder Worker eine vollwertige Node.js-Instanz. Sie können dann require nach Herzenslust bearbeiten. Sie zahlen dafür in einem größeren Anwendungsbereich und höheren Kommunikationskosten im Vergleich zu node-webworker-threads oder einem C ++ Add-on.

    
Jamie Davis 15.02.2017, 14:37
quelle