首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >nodejs 多线程支持

nodejs 多线程支持

作者头像
flytam
发布2020-01-14 17:53:08
1K0
发布2020-01-14 17:53:08
举报

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

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

斐波那契数列测试如下: 单线程阻塞运算,三次结算的结果是叠加的

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
GPU 云服务器
GPU 云服务器(Cloud GPU Service,GPU)是提供 GPU 算力的弹性计算服务,具有超强的并行计算能力,作为 IaaS 层的尖兵利器,服务于深度学习训练、科学计算、图形图像处理、视频编解码等场景。腾讯云随时提供触手可得的算力,有效缓解您的计算压力,提升业务效率与竞争力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档