node.js worker 尝鲜

790 阅读2分钟

Worker threads

简介

浏览器中我们能使用Woker开启多线程,但是node.js 一直没有引入这个功能。直到version 10 中才加入,然后在version 12中才被标记为Stable,也就意味着可以在生产环境中使用了。

使用

首先我们查看官方文档,通过例子学习如何在Node.js 中使用worker。 通过文档我们可以看到Node.js 通过worker_threads模块来暴露worker相关API。英文看不懂没关系,看代码就行了

const { Worker, isMainThread, parentPort } = require('worker_threads');

// 判断是否为主线程
if (isMainThread) {
  // 创建一个子线程
  const worker = new Worker(__filename);
  // 打印线程的id
  console.log(worker.threadId);
  // 监听子线程发送的消息
  worker.once('message', (message) => {
    console.log(message);  // Prints 'Hello, world!'.
  });
  // 给子线程发送消息
  worker.postMessage('Hello, world!');
} else {
  // 给父线程发送数据
  parentPort.once('message', (message) => {
    parentPort.postMessage(message);
  });
}

代码还是看不懂的话,就去面壁吧。。。。。。(当然说笑的了)

Node.js 中为什么要引入多线程呢

我们都知道因为单线程的原因,Node.js不适合CPU密集型的任务,例如计算斐波那契数列。为了解决这个问题,引入多线程来并行的执行js 代码; 对于IO密集型的任务来说,多线程并不能带来多大帮助,相对来说异步IO 更加高效。

总结

在代码中开启多线程,还是挺容易的。如果我们有遇到CPU 密集型的任务可以用多线程来解决。当然创建一个线程还是有一定的开销的,所以我们很容易想到预先创建线程,使用的时候获取一个线程就可以了,这正是线程池的概念。

社区里面也提供了有相应的npm 包,让我们更方便的在业务中使用线程池,感兴趣的同学可以查看使用文档。