在讀這篇博客之前,我強(qiáng)列建議先閱讀我的前兩篇文章:

  • Getting Started With Node.js
  • Node.js - Modules

    在這篇文章中,我們將學(xué)習(xí) Node.js 中的事件循環(huán)(event loop)。我們還將了解 Node.js 的代碼執(zhí)行過程。在我第一篇文章中我告訴大家 Node.js 是一個單線程的應(yīng)用程序。因?yàn)?Node.js 運(yùn)行的是 JavaScript,然而 JavaScript 是不支持多線程的,所以 Node.js 也不支持多線程。但是 Node.js 使用事件和回調(diào)(event and callbacks)的概念可以支持并發(fā)。這一切歸咎都是事件循環(huán)(event loop)的功勞。

事件循環(huán)(event loop)的工作機(jī)制

在 Getting Started With Node.js 這篇文章中我們已經(jīng)了解了 Node.js 的架構(gòu),其中我們還討論了 Node.js 的兩個主要組件:Google's V8 引擎 和 Libuv。其中事件循環(huán)(event loop)是用 C 和 C++ 編寫的 Libuv 的一部分。

上圖是 Node.js 的執(zhí)行過程,讓我們來一步一步理解它。

  1. 每當(dāng)請求進(jìn)入 Node.js 的 API 時將會被添加到事件循環(huán)(event loop)的隊列,因?yàn)?Node.js 不能同時處理多個請求。所以,所有的請求進(jìn)來后將會被添加到事件隊列里面。
  2. 現(xiàn)在,你可以在上圖中看到一個循環(huán),它總是檢查事件或請求是否在事件隊列中可用。如果有任何請求可用,那么根據(jù)隊列的“先進(jìn)先出”的特性,該請求將會被處理。
  3. Node.js 的事件循環(huán)(event loop)是單線程執(zhí)行的非阻塞 I/O 任務(wù)。它將請求發(fā)送到 C++ 內(nèi)部線程池(thread pool),里面可以運(yùn)行大量的線程任務(wù)。這個內(nèi)部 C++ 線程池(thread pool)是 Libev 組件中開發(fā)的事件循環(huán)(event loop)的一部分,它可以處理多個請求。事件循環(huán)一直檢查事件隊列中是否存在任務(wù),如果有并且阻塞進(jìn)程存在,將會有線程池來處理。
  4. 現(xiàn)在,內(nèi)部線程池(thread pool)可以處理很多請求,就像對數(shù)據(jù)庫請求,對文件的操作等等。
  5. 延伸閱讀

    學(xué)習(xí)是年輕人改變自己的最好方式-Java培訓(xùn),做最負(fù)責(zé)任的教育,學(xué)習(xí)改變命運(yùn),軟件學(xué)習(xí),再就業(yè),大學(xué)生如何就業(yè),幫大學(xué)生找到好工作,lphotoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)學(xué)習(xí)是年輕人改變自己的最好方式