iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 9
1
Modern Web

從零開始認識 Node.js系列 第 9

[Day 9] API 尋寶記 - 神秘的 Console 、 Cluster

Node.js Logo

前言

Node.js 讓 JavaScript 可以寫平臺,有 console 很正常,為什麼官網還要特定為它寫一個 API 呢?希望在我寫完這篇時得到解答。

API 尋寶記在 iT邦幫忙鐵人賽 一天介紹一、兩個 API 會說不完,因此這個系列介紹會調整成拿我常用 + 有興趣的部分出來寫,沒介紹的部分會在我個人的 Blog 中補齊。

這系列結束會介紹其他 Node.js 相關的工具和資料,因為翻來翻去深入一點的介紹中文很少,所以想看到實作的朋友建議你可以看看其他邦友系統文章,如

以上是最近可能會去走跳的部分 XDD

[來源] 不一樣的 Console ?

翻開 API 文件發現 Console 非常的訝異,所以想說來了解一下和我認識的 Console 有什麼不一樣?提供的 Console 內容有,

  • console.assert(value[, message][, ...args])
  • console.dir(obj[, options])
  • console.error([data][, ...args])
  • console.info([data][, ...args])
  • console.log([data][, ...args])
  • console.time(label)
  • console.timeEnd(label)
  • console.trace(message[, ...args])
  • console.warn([data][, ...args])

然後翻開 MDN JavaScript 的 Console 文件 可以發現少了不少內容,此時我才想起 Node.js 雖然實現 JavaScript 寫平臺,但核心是 C++ ,處理 Console 實際是借 stdout 、 stderr 來實現!這下我可終於了解官網特地介紹 Console 的原因。而 Console 預設已經載入在全域裡,因此在使用時可以不必寫 import console from 'Console'var console = require('console'),若想自訂 Console 可以看官方 new Console 的 Example Code ,若有不了解可以在底下留言給我。

[來源] 沒有多行程的 Node.js ?

大誤會!從 API 文件顯示早在 Node.js v0.6.0 就開始支援多行程,至於當時的功能完善程度,時間有些久遠容我偷懶,若有前輩知道還希望能提供資訊給我。

官方 Example Code 提供使用方法,

// app.js 的內容

// 載入多行程與 HTTP 兩個 Module
const cluster = require('cluster');
const http = require('http');

// 載入 os Module 取得電腦 CPU 的數量
const numCPUs = require('os').cpus().length;

// 若 process.env.NODE_UNIQUE_ID 是 undefined ,表示目前 Master
if (cluster.isMaster) {
  for (var i = 0; i < numCPUs; i++) {
    // 這裡的 fork 使用的是 child_process.fork()
    cluster.fork();
  }

  cluster.on('exit', (worker, code, signal) => {
    console.log(`worker ${worker.process.pid} died`);
  });
} else {
  http.createServer((req, res) => {
    res.writeHead(200);
    res.end('hello world\n');
  }).listen(8000);
}

不過我也沒有用過 Node.js 多執行緒,原因是覺得不方便。因此多執行緒我會透過 PM2 的方式實現與管理。使用 PM2 的好處是

  1. 不必調整現有檔案即可使用 Cluster
  2. 指令簡單

以官方 Example Code 使用所有 CPU ,換到 PM2 改為

// app.js 的內容
const http = require('http');

http.createServer((req, res) => {
    res.writeHead(200);
    res.end('hello world\n');
}).listen(8000);

執行時從 node app.js 改為 pm2 start app.js -i max ,若只希望執行 2 個行程只要將 max 改為 2 ( pm2 start app.js -i 2 ) 即可。是否覺得 PM2 的設定更友善呢?

參考資料

  1. Node.js clustering made easy with PM2

上一篇
[Day 8] API 尋寶記 - 入門第一關 Command Line Options
下一篇
[Day 10] API 尋寶記 - 不知不覺都會用到的 Global
系列文
從零開始認識 Node.js31

2 則留言

0
SunAllen
iT邦高手 1 級 ‧ 2016-12-09 00:25:29

大大,請問...走跳(不懂這個意思)
/images/emoticon/emoticon25.gif
請開釋...orz

可以解釋成 光顧,這詞記得來自 台語 ,國語辭典查不到 XDD
( 突然要解釋還真不知道怎麼說才到味 :p )

0
fillano
iT邦超人 1 級 ‧ 2016-12-09 10:27:06

補充一下,cluster不是多執行緒,是多行程(process)。

立馬修正,感謝 fillano !

寫得時候一直在想是行程、執行緒?執行緒是 thread ,行程是 process。(偷懶沒查資料,出包了 :p)

我要留言

立即登入留言