nodejs 多线程支持

nodejs在v10.5.0新增了多线程的支持,并且在v11中不需要再加实验特性后缀即可直接使用。

使用起来也是非常简便,核心API就以下几个

nodejs 多线程支持_第1张图片

从使用流程上来说

1、类似于cluster的多进程模式需要判断当前是否主进程,这边也提供了类似的api。通过isMainThread即可。

const {
  isMainThread
} = require('worker_threads');

2、然后,肯定要启动多线程吧。这时候就需要提供的Worker构造函数去启动,并且主线程也可以通过workerData去传递数据给工作线程。

const {
  isMainThread,
  Worker,
  workerData // 在主线程为null,工作线程中为主线程传递的值 
} = require('worker_threads');

Worker构造函数第一个参数默认是执行的js文件路径,或者当第二个可选参数evaltrue时,可以行内执行。

按照node文档样例就是下面这样。传递的数据通过第二个参数的workerData传入。在工作线程中,直接取workerData即可。

// 主线程
const worker = new Worker(__filename, {
    workerData: script// 传递的数据,可以是任意合法js值,会深拷贝一份过去
 });
// 工作线程
const {
  Worker, 
  parentPort, // 表示父进程的 MessagePort 类型的对象,在主线程里为 null
  workerData // 主线程传递过来的数据
} = require('worker_threads');

3、线程通信

线程通信的用法就和进程通信类似

// 主线程
const worker = new Worker(__filename, {
    workerData: script
    });
worker.on('message', (data)=>{
    console.log(data) // 接收工作线程数据并打印
});
parentPort.postMessage('hello') // 向工作线程发送数据
// 工作线程
parentPort.postMessage('hello') // 向父线程发送数据
parentPort.on('message', (data)=>{
    console.log(data) // 接收主线程数据并打印
});

worker_threads模块还有MessageChannel类和MessagePort类(继承于EventEmitter

  • MessageChannel类: 包含两个已经互相能够跨线程通信的 MessagePort 类型对象,可用于创建自定义的通信频道。实例化后包含两个属性port1port2MessagePort 类型对象。可将其中一个发到工作线程后通过该对象实现自定义跨线程通信

  • MessagePort: 用于跨线程通信的句柄,继承了 EventEmitter,包括 close message 事件用于接收对象关闭和发送的消息,以及 close postMessage 等操作。

工作线程中有一些区别的地方,详情在文档

斐波那契数列测试如下:
单线程阻塞运算,三次结算的结果是叠加的
nodejs 多线程支持_第2张图片

而使用了多线程,它们则是并行计算的

nodejs 多线程支持_第3张图片

你可能感兴趣的:(nodejs)