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 包,让我们更方便的在业务中使用线程池,感兴趣的同学可以查看使用文档。