文章目录加载中

NodeJS多线程模块研究 - worker_threads

代码 node 版本:v14.8.0

# Quick Start

js 和 nodejs 一直都是单线程,直到官方推出了 worker_threads 模块,用来解决 CPU 密集型计算场景。

可以通过以下代码快速开启一个工作线程:

if (isMainThread) {
  // 这会在工作线程实例中重新加载当前文件。
  new Worker(__filename);
  console.log("在主进程中");
  console.log("isMainThread is", isMainThread);
  // Worker可以启动指定文件,也可以配合eval参数,直接启动代码
  // 由于在子线程中没有process.env,所以这里可以配合workerData选项
  // 那么在子线程中,workerData会按照HTML结构化克隆算法
  // 将workerData克隆到 require('worker_thread')中
} else {
  console.log("在工作线程中");
  console.log("isMainThread is", isMainThread); // 打印 'false'。
}

上面代码的输出是:

在主进程中
isMainThread is true
在工作线程中
isMainThread is false

# 工作线程下的底层模型

对于单线程,Nodejs 是由以下部分组成:

  • 一个进程
  • 一个线程
  • 一个事件循环
  • 一个 JS 引擎实例
  • 一个 Node.js 实例

对于工作线程,Nodejs 组成变成了:

  • 一个进程
  • 多个线程
  • 每个线程独立的事件循环
  • 每个线程独立的 JS 引擎实例
  • 每个线程独立的 Node.js 实例

如下图所示:

# 多线程是否可以并行?

并发是快速切换任务,本质还是串行执行;并发是同时执行任务。

而多线程可以并发,也可以并行,这取决于是否能抢占到 CPU 资源。这个过程是操作系统来调度,不可人为控制。

但总的来说,多线程和多进程类似,都提高了 CPU 的利用率。因此,worker_threads 被设计用来提高 CPU 密集型计算的性能。

# 参考文章

本文来自心谭博客:xin-tan.com,经常更新web和算法的文章笔记,前往github查看目录归纳:github.com/dongyuanxin/blog