前言
Node.js 最令人诟病的技术债就是它只支援单执行绪,必须透过各种手段才能达到类似的功能,可参考[这一篇]
(https://itnext.io/multi-threading-and-multi-process-in-node-js-ffa5bb5cde98),但是,程式就变得複杂许多了,今天,看到 Node.js 的头头 Adam Polak 宣布新版v12将支援 Multi-Threading,兴奋之余,忍不住跟大家分享一下,原文请参考这里。
测试
先写一个测试程式,取名 app.js,如下:
const express = require('express');const fs = require('fs');const app = express();app.get('/', (req, res) => { res.json({ message: 'Hello world!' })});app.get('/compute', (req, res) => { let json = {}; for (let i=0;i<100000;i++) {} res.json({ message: 'done' })});app.listen(3000);
安装express套件npm install express -save执行 node app.js打开浏览器,在两个页籤分别输入
http://localhost:3000/compute
http://localhost:3000/
可以看到第一个页籤执行完毕后,才会执行第二个页籤,表示Node.js只支援单执行绪。
v12 将提供的作法如下:
const express = require('express');const fs = require('fs');const { Worker, isMainThread, parentPort, workerData } = require('worker_threads');if (isMainThread) { console.log("Spawn http server"); const app = express(); app.get('/hello', (req, res) => { res.json({ message: 'Hello world!' }) }); app.get('/compute', (req, res) => { const worker = new Worker(__filename, {workerData: null}); worker.on('message', (msg) => { res.json({ message: 'done' }); }) worker.on('error', console.error); worker.on('exit', (code) => {if(code != 0) console.error(new Error(`Worker stopped with exit code ${code}`)) }); }); app.listen(3000);} else { let json = {}; for (let i=0;i<100;i++) { json = JSON.parse(fs.readFileSync('./big-file.json', 'utf8')); } json.data.sort((a, b) => a.index - b.index); parentPort.postMessage({});}
主要加了两行:
引进 worker_threads 套件。const { Worker, isMainThread, parentPort, workerData } = require('worker_threads');
『compute』 handler 使用 Worker 为每一次的request产生新执行绪。const worker = new Worker(__filename, {workerData: null});
其他新功能
除了支援多执行绪(Multi-Threading)外,另外还有以下新功能:
提供 N-API,支援内嵌 C/C++/Rust 程式。支援 HTTP/2。结语
看到文章后,兴沖沖的準备安装新版测试一下,一看网站,目前能只能下载 v10,傻眼了,只能相信作者所言,Coming soon...。