Multithreading für zip in nodejs

8

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

Alex
quelle
Grundsätzlich benötigen Sie eine Bibliothek mit einem nativen Modul, das Zugriff auf Threads hat. Die Knotenarchitektur ermöglicht diesen Modulen den Zugriff auf Threads.
Sn0bli
In Node 10.5.0 können Sie ein --experimental-worker-Flag für "Multithreading" durch Worker-Threads verwenden. In Node v11.7.0 haben sie standardmäßig Worker verfügbar gemacht und das Flag nodejs.org/en/blog/ entfernt. release / v11.7.0 nodejs.org/de/blog/release/v10.5.0 , Sie können die Beispiele medium.com/@Trott/using-worker-threads-in-node-js-80494136dbb6
redhatvicky

Antworten:

5

Laut Zlib-Dokumentation

Threadpool-Verwendung: Alle zlib-APIs mit Ausnahme derjenigen, die explizit synchron sind, verwenden den Threadpool von libuv. Dies kann in einigen Anwendungen zu überraschenden Effekten führen, z. B. zu einer unterdurchschnittlichen Leistung (die durch Anpassen der Poolgröße gemindert werden kann) und / oder zu einer nicht behebbaren und katastrophalen Speicherfragmentierung. https://nodejs.org/api/zlib.html#zlib_threadpool_usage

Gemäß dem Threadpool von libuv können Sie die Umgebungsvariable UV_THREADPOOL_SIZEändern, um die maximale Größe zu ändern

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

Strike Eagle
quelle
2

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

Schlanker Codierer
quelle
1

Hilfe zum Multithreading in Knoten js. Sie müssen unten drei Dateien erstellen

index.mjs

import run from './Worker.mjs';

/**
* design your input list of zip files here and send them to `run` one file name at a time
* to zip, using a loop or something. It acts as promise.
* exmaple : run( <your_input> ).then( <your_output> );
**/

Worker.mjs

import { Worker } from 'worker_threads';

function runService(id, options) {
    return new Promise((resolve, reject) => {
        const worker = new Worker('./src/WorkerService.mjs', { workerData: { <your_input> } });
        worker.on('message', res => resolve({ res: res, threadId: worker.threadId }));
        worker.on('error', reject);
        worker.on('exit', code => {
            if (code !== 0)
                reject(new Error(`Worker stopped with exit code ${code}`));
        });
    });
}

async function run(id, options) {
    return await runService(id, options);
}

export default run;

WorkerService.mjs

import { workerData } from 'worker_threads';

// Here goes your logic for zipping a file, where as `workerData` will have <your_input>.

Lassen Sie mich wissen, ob es hilft.

Akshay
quelle
1

Können Zip- und Unzip-Vorgänge in NodeJS als Multithread ausgeführt werden?

Ja.

... und Sie können nicht mehrere Threads selbst starten ... da jede Zip-Datei in einem einzigen Thread behandelt werden muss

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.

Die oberste Ausgabe zeigt die Prozesse von node.js mit CPU-Threads

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 :

Worker (Threads) sind nützlich, um CPU-intensive JavaScript-Operationen auszuführen. Sie werden bei E / A-intensiver Arbeit nicht viel helfen. Die in Node.js integrierten asynchronen E / A-Vorgänge sind effizienter als Workers.

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.MMund verkettet sie zu einer einzigen process-me-2019-11-DDDatei. Das Komprimieren dauert eine Weile, sodass beim Blockieren eines neuen Prozesses das Blockieren des Hauptthreads vermieden wird.

Matt Simerson
quelle
Ein Knotenprozess kann mehrere Threads starten. Da diese jedoch nicht denselben Code und dieselben Variablen verwenden, können Sie diese Threads nicht zum Komprimieren derselben Datei oder zum Extrahieren aus derselben Datei verwenden. Wie kann ich mit mehreren Threads aus einer Zip-Datei extrahieren, ohne in jedem Thread dieselbe Datei zu öffnen?
Alex
OIC, Sie möchten mehrere Threads verwenden, um eine einzelne Datei zu [de] komprimieren. Das nächste, was Sie erreichen können, ist das Laichen eines externen Prozesses, auf dem ein Dienstprogramm zur parallelen Komprimierung wie pigz ausgeführt wird . Oder möchten Sie, dass ein einzelnes Archiv geöffnet ist und andere Knotenprozesse (mithilfe von IPC) daraus lesen können?
Matt Simerson
0

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.

Sudhir Roy
quelle
Das ist falsch. Nodejs ermöglicht Worker-Threads. Lesen Sie hier mehr: nodejs.org/api/worker_threads.html
Strike Eagle
Der Worker ist kein Multithreading, sondern wird in einem völlig anderen Prozess ausgeführt. RabitMQ (Blaupause des Arbeiters, aber mit vielen Fähigkeiten)
Sudhir Roy
"Technisch" gibt es Ihnen am Ende des Tages die gleiche Möglichkeit, Anweisungen in einem anderen Thread auszuführen und die Ausgabe zu empfangen.
Strike Eagle