nodejs中zip的多线程

可以在 nodejs 中进行多线程压缩和解压缩操作吗?

有一堆像 yauzl 这样的模块,但都没有使用多线程,而且你不能用 node-cluster 或类似的东西自己启动多个线程,因为每个 zip 文件都必须在单个线程中处理


三国纷争
浏览 352回答 3
3回答

慕妹3242003

根据 Zlib 文档线程池用法:所有 zlib API,除了那些显式同步的 API,都使用 libuv 的线程池。这可能会在某些应用程序中导致令人惊讶的效果,例如性能不佳(可以通过调整池大小来缓解)和/或不可恢复的灾难性内存碎片。 https://nodejs.org/api/zlib.html#zlib_threadpool_usage根据libuv的线程池,您可以更改环境变量UV_THREADPOOL_SIZE以更改最大大小如果您希望同时压缩许多小文件,您可以使用 Worker Threads https://nodejs.org/api/worker_threads.html再次阅读您的问题时,您似乎想要多个文件。使用 Worker Threads,它们不会阻塞你的主线程,你可以通过 promise 从它们那里获取输出。

一只甜甜圈

Node JS 使用 Libuv 和工作线程。工作线程是一种以多线程方式进行操作的方式。通过使用 libuv(它在线程池中维护线程),您可以增加默认节点 js 服务器的线程。您可以使用两者来提高节点 js 的操作性能。所以这里是工作线程的官方文档:https : //nodejs.org/api/worker_threads.html在此处查看如何增加节点 js 中的线程池:在节点 js 8 中打印 libuv线程池大小

一只萌萌小番薯

有关如何在 node js 中进行多线程的帮助。您必须创建以下三个文件索引.mjsimport 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.mjsimport { Worker } from 'worker_threads';function runService(id, options) {&nbsp; &nbsp; return new Promise((resolve, reject) => {&nbsp; &nbsp; &nbsp; &nbsp; const worker = new Worker('./src/WorkerService.mjs', { workerData: { <your_input> } });&nbsp; &nbsp; &nbsp; &nbsp; worker.on('message', res => resolve({ res: res, threadId: worker.threadId }));&nbsp; &nbsp; &nbsp; &nbsp; worker.on('error', reject);&nbsp; &nbsp; &nbsp; &nbsp; worker.on('exit', code => {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (code !== 0)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; reject(new Error(`Worker stopped with exit code ${code}`));&nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; });}async function run(id, options) {&nbsp; &nbsp; return await runService(id, options);}export default run;WorkerService.mjsimport { workerData } from 'worker_threads';// Here goes your logic for zipping a file, where as `workerData` will have <your_input>.如果有帮助,请告诉我。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript