1. 程式人生 > >[譯]Node.js

[譯]Node.js

介紹

在讀這篇部落格之前,我強列建議先閱讀我的前兩篇文章:

  • 在這篇文章中,我們將學習 Node.js 中的事件迴圈(event loop)。我們還將瞭解 Node.js 的程式碼執行過程。在我第一篇文章中我告訴大家 Node.js 是一個單執行緒的應用程式。因為 Node.js 執行的是 JavaScript,然而 JavaScript 是不支援多執行緒的,所以 Node.js 也不支援多執行緒。但是 Node.js 使用事件和回撥(event and callbacks)的概念可以支援併發。這一切歸咎都是事件迴圈(event loop)的功勞。

事件迴圈(event loop)的工作機制

Getting Started With Node.js 這篇文章中我們已經瞭解了 Node.js 的架構,其中我們還討論了 Node.js 的兩個主要元件:Google's V8 引擎 和 Libuv。其中事件迴圈(event loop)是用 C 和 C++ 編寫的 Libuv 的一部分。
此處輸入圖片的描述
上圖是 Node.js 的執行過程,讓我們來一步一步理解它。

  1. 每當請求進入 Node.js 的 API 時將會被新增到事件迴圈(event loop)的佇列,因為 Node.js 不能同時處理多個請求。所以,所有的請求進來後將會被新增到事件佇列裡面。
  2. 現在,你可以在上圖中看到一個迴圈,它總是檢查事件或請求是否在事件佇列中可用。如果有任何請求可用,那麼根據佇列的“先進先出”的特性,該請求將會被處理。
  3. Node.js 的事件迴圈(event loop)是單執行緒執行的非阻塞 I/O 任務。它將請求傳送到 C++ 內部執行緒池(thread pool),裡面可以執行大量的執行緒任務。這個內部 C++ 執行緒池(thread pool)是 Libev 元件中開發的事件迴圈(event loop)的一部分,它可以處理多個請求。事件迴圈一直檢查事件佇列中是否存在任務,如果有並且阻塞程序存在,將會有執行緒池來處理。
  4. 現在,內部執行緒池(thread pool)可以處理很多請求,就像對資料庫請求,對檔案的操作等等。
  5. 每當有執行緒完成任務,將會呼叫回撥函式(callback function),並將響應結果傳送回事件迴圈(event loop)。
  6. 事件迴圈將響應傳送回請求客戶端完成一次請求處理。

示例

下面的示例將會展示事件迴圈(event loop)的工作機制:

var fs = require('fs');  
var i = 1;  
fs.watch("file.txt", function (event, filename) {  
    var EventId = "#" + i;  
    var EventName = " Event: " + event;  
    var FileName = " FileName: " + filename;  
    var Time = " Time: " + new Date();  
    var data = EventId.concat(EventName, FileName, Time, "\n");  
    console.log(data);  
    i++;  
});  
console.log("Now we are watching file.txt\n");  

在上面的示例中,第一行載入了 fs 模組用於操作檔案系統,並且定義了一個變數 i 來做為計數器。然後使用 fs.watch() 方法來監視 file.txt 檔案。這個監視方法的回撥函式的引數包含了事件(event)和檔名(filename)。所以,每當檔案有變化,這個回撥函式將會被呼叫,並將日誌列印到控制檯上面。我們將上面的程式碼儲存為 app.js
注:我的 file.txt 檔案和 app.js 在同一個目錄,我的檔案結構如下圖如示:
此處輸入圖片的描述
現在,我們執行程式,並修改這個 file.txt 檔案。當我們儲存後,將會看到下面的輸出日誌:
此處輸入圖片的描述
上面的結果顯示,當 file.txt 發生任何變化,fs.watch() 的回撥函式將會在事件迴圈(event loop)中被呼叫,並且事件迴圈(event loop)將會一直檢查檔案是否發生了變化。你還可以使用下面的程式碼將該事件資訊記錄在一個檔案中:

var fs = require('fs');  
fs.writeFile('log.txt', '', function (err) {  
    if (err) throw err;  
    console.log('File Saved Successfully!');  
});  
var i = 0;  
fs.watch("target.txt", function (event, filename) {  
    var EventId = "#" + i;  
    var EventName = " Event: " + event;  
    var FileName = " FileName: " + filename;  
    var Time = " Time: " + new Date();  
    var data = EventId.concat(EventName, FileName, Time,"\n");  
    fs.appendFile('log.txt', data, function (err) {  
        if (err) {  
            console.log(err);  
        }  
    });  
    i++;  
});  

好了,我希望這篇文章對你有幫助。謝謝!

相關推薦

[] Node.js 高效能和可擴充套件應用程式的最佳實踐 [第 2/3 部分]

原文地址:Good practices for high-performance and scalable Node.js applications [Part 2/3] 原文作者:virgafox 譯文出自:掘金翻譯計劃 本文永久連結:github.com/xitu/gold

[] Node.js 高效能和可擴充套件應用程式的最佳實踐 [第 1/3 部分]

原文地址:Good practices for high-performance and scalable Node.js applications [Part 1/3] 原文作者:virgafox 譯文出自:掘金翻譯計劃 本文永久連結:github.com/xitu/gold

[]Node.js

介紹 在讀這篇部落格之前,我強列建議先閱讀我的前兩篇文章: 在這篇文章中,我們將學習 Node.js 中的事件迴圈(event loop)。我們還將瞭解 Node.js 的程式碼執行過程。在我第一篇文章中我告訴大家 Node.js 是一個單執行緒的應用程式。因為 Node.js 執行的是 JavaScr

Node.js中的Event Loop

原文連結: flaviocopes.com/node-event-… 指南 為了瞭解Node,Event Loop(後面我會翻譯成“事件迴圈”)是其中最重要的方面。 為什麼它如此重要?因為它表明了Node是怎樣做到非同步並且擁有非堵塞的I/O操作,當然也是使得Node的“殺手級”應用得以成功的重要原因。

【nodejs原理&原始碼賞析(7)】【Node.js中的事件迴圈,定時器和process.nextTick

目錄 Event Loop 是什麼? Event Loop 基本解釋 事件迴圈階段概覽 事件迴圈細節 timers pending callbacks poll

node.js對象數據類型

js對象 arr 基本 strong doc 九九乘法 oca 自定義 number 在這裏復習下前端JS的數據類型:前端JS中的數據類型: 1.基本/原生/值類型 string、number、boolean、null、undefined 2.引用/對象

node.js(連接mysql)

權限 alt 第三方 定義 let creat 服務器 dcl local mysql語句中的SQL sql語句中的分類: ---DDL:(data define language)定義數據列(create,drop,alter,truncate)

Node.js Path 模塊

工具 詳細 模塊 module tro ebp dex ble put var path = require(‘path‘); module.exports = { entry: ‘./app/index.js‘, output: { filename:

window下安裝nvm、node.js、npm的步驟

http cnp node 自帶 ack pre 最新 test 通過 1.下載nvm(nodejs版本管理工具) https://github.com/coreybutler/nvm-windows/releases 下載nvm-noinstall.zip,解壓即可使用2

node.js cannot find module 'mysql'

nod 分享 warn npm oam 如果 pac erro .com nodejs cannot find module ‘mysql‘ 問題分析 在windows平臺下,測試nodejs連接mysql數據庫。 首先 在控制臺中安裝mysql依賴包 一開始我是

安裝node.js

進制 idt inux none class next 獲取 figure acl 本安裝教程以Node.js v4.4.3 LTS(長期支持版本)版本為例。 Node.js安裝包及源碼下載地址為:https://nodejs.org/en/download/。 你

antd + node.js + mongoose小總結

node push cse define oos 新博客 mongoose exe ant 最近開發太忙,都沒時間更新博客,想通過這篇博客總結一下相關經驗,以備後續能用到: 一、antd 1.onChange of undefined問題:可能是頁面中表單取了相同的名稱,也

Node.js的Buffer那些你可能不知道的用法

ins min 來看 imu write work and sse ase 在大多數介紹Buffer的文章中,主要是圍繞數據拼接和內存分配這兩方面的。比如我們使用fs模塊來讀取文件內容的時候,返回的就是一個Buffer: fs.readFile(‘filename‘, fu

基於原生JS+node.js+mysql打造的簡易前後端分離用戶登錄系統

power 3.2 80端口 文檔 type ima 原生 倉庫 json 一、登錄頁面 這個沒什麽說的,就放兩張圖 二、服務器端 用express(文檔)搭建服務器,數據褲用mysql(基礎語句),新建一個users,再新建一張users表,我們用這張表。 服務器主要是

node.js(一)

io模型 對象 交互 開發 理解 後端 google 異步io tex 一、nodejs是什麽??  我們知道JavaScript是運行在瀏覽器中的,瀏覽器為它提供了一個上下文(context),從而讓JavaScript得以解析執行。 nodeJS其實可以這麽理解,它是另

node.js的Buffer類

cee source 3.3 encoding all 個數 p s lis other 1、創建 創建一個長度為256的Buffer實例:var buf = new Buffer(256); 創建一個數組:var buf = new Buffer([10, 20, 30,

node.js利用captchapng模塊實現圖片驗證碼

parse math style ase 圖片驗證碼 all pre 驗證 parseint 安裝captchapng模塊 npm install captchapng nodejs中使用 var express = require(‘express‘); v

Node.js入門以及第一個helloworld程序

目錄 rip 工作 直播 需要 減少 web容器 用戶 長連接 1、概念:簡單的說 Node.js 就是運行在服務端的 JavaScript。學之前需要明白Node.js是無法挑戰jsp、php或者asp這種老牌網站的地位的,是永遠不會出現在證券、金融這種領域的。node.

node.js 導出當前模塊的內部成員

ejs func export 計算 簡寫 spa rime color turn //當前模塊三個成員 //1:常量 const PI = 3.14; //2:二個方法 //計算面積 function getSize(r){ return PI * r *

Node.js EventEmitter

程序崩潰 pri 函數名 use cte 創建 () lba 順序 Node.js EventEmitter Node.js 所有的異步 I/O 操作在完成時都會發送一個事件到事件隊列。 Node.js裏面的許多對象都會分發事件:一個net.Server對象會在每次有新連接