Können Zip- und Unzip-Vorgänge in NodeJS als Multithread ausgeführt werden?
Es gibt eine Reihe von Modulen wie yauzl, aber keines verwendet mehrere Threads, und Sie können nicht mehrere Threads selbst mit Node-Cluster oder ähnlichem starten, da jede Zip-Datei in einem einzigen Thread behandelt werden muss
javascript
node.js
zip
Alex
quelle
quelle
Antworten:
Laut Zlib-Dokumentation
Gemäß dem Threadpool von libuv können Sie die Umgebungsvariable
UV_THREADPOOL_SIZE
ändern, um die maximale Größe zu ändernWenn Sie stattdessen viele kleine Dateien gleichzeitig komprimieren möchten, können Sie Worker Threads https://nodejs.org/api/worker_threads.html verwenden
Wenn Sie Ihre Frage erneut lesen, möchten Sie anscheinend mehrere Dateien. Verwenden Sie Worker-Threads. Diese blockieren Ihren Haupt-Thread nicht und Sie können die Ausgabe über Versprechen zurückerhalten.
quelle
Knoten JS verwendet Libuv und Worker-Thread. Worker-Thread ist eine Möglichkeit, Operationen mit mehreren Threads auszuführen. Während Sie libuv verwenden (es verwaltet den Thread im Thread-Pool), können Sie den Thread des Standardknoten-JS-Servers erhöhen. Sie können beide verwenden, um die Leistung des Knotens für Ihren Betrieb zu verbessern.
Hier ist also die offizielle Dokumentation für den Arbeitsthread: https://nodejs.org/api/worker_threads.html
Sehen Sie hier, wie Sie den Thread-Pool in Knoten js erhöhen können: Drucken Sie die Größe des libuv- Thread-Pools in Knoten js 8
quelle
Hilfe zum Multithreading in Knoten js. Sie müssen unten drei Dateien erstellen
index.mjs
Worker.mjs
WorkerService.mjs
Lassen Sie mich wissen, ob es hilft.
quelle
Ja.
Ich vermute, Ihre Prämisse ist fehlerhaft. Warum genau kann ein Knotenprozess Ihrer Meinung nach nicht mehrere Threads starten? Hier ist eine App, die ich ausführe und die das sehr ausgereifte Clustermodul node.js mit einem übergeordneten Prozess als Supervisor und zwei untergeordneten Prozessen verwendet, die stark netzwerk- und festplatten-E / A-gebundene Aufgaben ausführen.
Wie Sie in der sehen können
C
Spalte sehen können, wird jeder Prozess in einem separaten Thread ausgeführt. Auf diese Weise reagiert der Master-Prozess weiterhin auf Befehls- und Steuerungsaufgaben (wie das Laichen / Ernten von Workern), während die Worker-Prozesse CPU- oder festplattengebunden sind. Dieser bestimmte Server akzeptiert Dateien aus dem Netzwerk, dekomprimiert sie manchmal und speist sie über externe Dateiprozessoren. IOW, es ist eine Aufgabe, die die von Ihnen beschriebene Komprimierung umfasst.Ich bin nicht sicher, ob Sie Worker-Threads verwenden möchten, die auf diesem Snippet aus den Dokumenten basieren :
Für mich schreit diese Beschreibung: "crypo!" In der Vergangenheit habe ich untergeordnete Prozesse erzeugt, wenn teure Crypo-Operationen ausgeführt werden müssen.
In einem anderen Projekt verwende ich das child_process- Modul des Knotens und starte jedes Mal einen neuen untergeordneten Prozess, wenn ich einen Stapel von Dateien zum Komprimieren habe. Dieser bestimmte Dienst sieht eine Liste von ~ 400 Dateien mit Namen wie
process-me-2019.11.DD.MM
und verkettet sie zu einer einzigenprocess-me-2019-11-DD
Datei. Das Komprimieren dauert eine Weile, sodass beim Blockieren eines neuen Prozesses das Blockieren des Hauptthreads vermieden wird.quelle
Es gibt keine Möglichkeit, Multithreading in reinen Nodejs durchzuführen, bis Sie eine Bibliothek eines Drittanbieters verwenden. Sie können den Prozess parallel mit Versprechungen ausführen. Wenn Sie den vom Thread verwendeten Hauptthread nicht überladen möchten, können Sie RabitMQ (Redis Queue) implementieren. Es wird in einem eigenen Thread ausgeführt, sodass Ihr Haupt-Thread niemals blockiert wird.
quelle