iT邦幫忙

3

Node.js 總算要支援多執行緒(Multi-Threading) 了

前言

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);
  1. 安裝express套件
    npm install express -save
  2. 執行 node app.js
  3. 打開瀏覽器,在兩個頁籤分別輸入
    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({});
}

主要加了兩行:

  1. 引進 worker_threads 套件。
const { Worker, isMainThread, parentPort, workerData } = require('worker_threads');
  1. 『compute』 handler 使用 Worker 為每一次的request產生新執行緒。
const worker = new Worker(__filename, {workerData: null});

其他新功能

除了支援多執行緒(Multi-Threading)外,另外還有以下新功能:

  1. 提供 N-API,支援內嵌 C/C++/Rust 程式。
  2. 支援 HTTP/2。

結語

看到文章後,興沖沖的準備安裝新版測試一下,一看網站,目前能只能下載 v10,傻眼了,只能相信作者所言,Coming soon...。


1 則留言

0
dragonH
iT邦高手 1 級 ‧ 2019-07-17 11:30:48

話說 v10 開始 HTTP/2 不就已經 stable 了/images/emoticon/emoticon14.gif

比起這個

express 5 已經難產了許久

只能用其他方法建 http/2

沒辦法直接用 官方的 http/2 module /images/emoticon/emoticon31.gif

/images/emoticon/emoticon09.gif

我要留言

立即登入留言