nodejs 多线程支持

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

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

在这里插入图片描述

从使用流程上来说

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 等操作。

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

斐波那契数列测试如下:
单线程阻塞运算,三次结算的结果是叠加的
在这里插入图片描述

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

在这里插入图片描述

  • 14
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值