简介
piscina
是一个高度优化过的 Node.js 进程池,它可以帮助我们在 Node.js 中执行 CPU 密集型任务,避免阻塞 I/O 线程。
安装
使用 npm
在项目中安装 piscina
包。
npm install piscina
使用方法
初始化一个 piscina 实例
const { Piscina } = require('piscina'); const piscina = new Piscina({ filename: 'worker.js', });
通过 Piscina
构造函数创建一个 piscina
实例,filename
是一个必须的选项,它指定了 worker.js
脚本文件的路径。
向 piscina 实例提交任务
const result = await piscina.runTask({ input: `Hello World!` }); console.log(result);
runTask
方法接收一个对象,该对象代表了要在 piscina 中运行的任务。input
属性包含要传递给任务的参数。
-- -------------------- ---- ------- ----- -------- -------- -- - ----- ------ - - - -- ------ ------- - ----- ------ - ----- ----------------- ----- ------ ------ --- --- --- -------------------- -- -- -
我们也可以将一个已存在的函数作为任务,在 input
属性中将参数传递给该函数。
暴露多个函数
通过 parentPort.expose
方法可以向 worker.js
中的 parentPort
通信对象暴露多个函数。
parentPort.expose('multiplyByTwo', (n) => n * 2); parentPort.expose('multiplyByThree', (n) => n * 3);
多个函数可以一次性暴露。
parentPort.expose({ multiplyByTwo: (n) => n * 2, multiplyByThree: (n) => n * 3, });
导入 npm 包
在 worker.js
中,我们可以像在普通 Node.js 脚本中一样,使用 require
方法导入 npm 包。
const _ = require('lodash');
然而,piscina 会在 worker.js
启动期间缓存所有的导入,因此不能使用 import
语句。
自定义 worker 线程数
当创建 piscina
实例时,可以使用 maxThreads
选项指定 worker 线程的数量。默认值是 CPU 内核数。
const piscina = new Piscina({ filename: 'worker.js', maxThreads: 8, });
优雅地关闭 piscina 实例
为了确保我们在关闭 piscina 实例之前完成所有任务,请等待 runTask
方法的返回值,然后使用 destroy()
方法关闭 piscina 实例。
const result = await piscina.runTask({ input: `Hello World!` }); await piscina.destroy();
示例代码
parent.js
-- -------------------- ---- ------- ----- - ------- - - ------------------- ----- ------- - --- --------- --------- ------------ --- ----- -------- ---------- - ----- ------- - ----- ----------------- ----- ------------- ------ ---- ---- --- ----- ------- - ----- ----------------- ----- -------------- ------ ------ -------- --- ------------------- -- ------------- ------------------- -- ------------- ----- ------------------ - ----- -------- --------------- -- - --- ------ - -- --- ---- - - -- - -- -- ---- - ------ -- -- - ------ ------- - ----- -------- ------------------ - ------ --------------------------------- - -----------
worker.js
-- -------------------- ---- ------- ----- - ---------- - - -------------------------- --- -- ------------------------ ----- -- ----- ----- -- -- - -- ------ - ----- ------ - ----- --------------- ------------------------------- - ---- - --------------------------- ----- ----------- - --- ---------------------- ------- -- - --------------------- ---
总结
使用 piscina
可以帮助我们在 Node.js 应用中优化 CPU 密集型任务的处理,避免阻塞 I/O 线程。在使用 piscina
时,要注意保证任务的正确性和效率,以及使用 destroy()
方法优雅地关闭 piscina
实例。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/5f70a444a9b7065299ccbb1c