面試之道之 Node.js 日誌模塊 console

如何實現方法 console.log?

實如今控制檯的打印,利用 process.stdout 將輸入流數據輸出到輸出流(即輸出到終端),好比javascript

process.stdout.write('你好,Node.js');
複製代碼

console 是同步的仍是異步的?

怎麼說呢,console 並不老是同步的,也不老是異步的。同步仍是異步取決於連接的是什麼流以及操做系統是 Windows 仍是 POSIX。java

POSIX,Portable Operating System Interface of UNIX,縮寫爲 POSIX,可移植操做系統接口。數據庫

同步寫可能會阻塞事件循環直到寫的過程完成。可能一瞬間就能寫到一個文件,但當系統處於高負載時,管道的接收端可能不會被讀取緩慢的終端或文件系統,由於事件循環被阻塞的足夠頻繁且足夠長的時間,這些可能會給系統性能帶來消極的影響。當你向一個交互終端會話寫時這可能不是個問題,但當生產日誌到進程的輸出流時要特別留心。異步

  • 文件(files): 兩個平臺下都是同步;
  • 終端(TTYs): Windows 平臺下同步,POSIX 平臺下異步;
  • 管道(pipes): Windows 平臺下同步,POSIX 平臺下異步;

爲何 console.log() 執行完後就退出?

好比下面一段,進程等待 3 秒後輸出 你好,Node.js!,接着等待 3 秒後輸出 你好,Node.js2!,而後退出。socket

setTimeout(() => {
    console.log('你好,Node.js!');
}, 3000);

setTimeout(() => {
    console.log('你好,Node.js2!');
}, 6000);
複製代碼

這裏就要牽扯到 Node.js 事件隊列。Node.js 會追蹤全部異步請求,當使用文件異步讀寫、socket 讀寫、定時器等異步操做時,全部的請求都會在事件隊列中。性能

  • http 請求、數據庫請求等 IO 請求操做;
  • net.Server.listen() 或者 http.Server.listen() 等端口監聽;
  • fs.write() 類型的文件 IO 操做;
  • console.log() 輸出日誌;
  • setTimeout()setInterval() 等定時器操做;
  • process.send() 等異步請求發送;

注意:當全部異步操做都結束時,Node.js 的進程纔會退出。ui

相關文章
相關標籤/搜索