前言
Node.js 最令人詬病的技術債就是它只支援單執行緒,必須透過各種手段才能達到類似的功能,可參考[這一篇]
(itnext.io/multi-threa… 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...。