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

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

    在這篇文章中,我們將學(xué)習(xí) Node.js 中的事件循環(huán)(event loop)。我們還將了解 Node.js 的代碼執(zhí)行過(guò)程。在我第一篇文章中我告訴大家 Node.js 是一個(gè)單線程的應(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 的兩個(gè)主要組件:Google's V8 引擎 和 Libuv。其中事件循環(huán)(event loop)是用 C 和 C++ 編寫(xiě)的 Libuv 的一部分。

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

  1. 每當(dāng)請(qǐng)求進(jìn)入 Node.js 的 API 時(shí)將會(huì)被添加到事件循環(huán)(event loop)的隊(duì)列,因?yàn)?Node.js 不能同時(shí)處理多個(gè)請(qǐng)求。所以,所有的請(qǐng)求進(jìn)來(lái)后將會(huì)被添加到事件隊(duì)列里面。
  2. 現(xiàn)在,你可以在上圖中看到一個(gè)循環(huán),它總是檢查事件或請(qǐng)求是否在事件隊(duì)列中可用。如果有任何請(qǐng)求可用,那么根據(jù)隊(duì)列的“先進(jìn)先出”的特性,該請(qǐng)求將會(huì)被處理。
  3. Node.js 的事件循環(huán)(event loop)是單線程執(zhí)行的非阻塞 I/O 任務(wù)。它將請(qǐng)求發(fā)送到 C++ 內(nèi)部線程池(thread pool),里面可以運(yùn)行大量的線程任務(wù)。這個(gè)內(nèi)部 C++ 線程池(thread pool)是 Libev 組件中開(kāi)發(fā)的事件循環(huán)(event loop)的一部分,它可以處理多個(gè)請(qǐng)求。事件循環(huán)一直檢查事件隊(duì)列中是否存在任務(wù),如果有并且阻塞進(jìn)程存在,將會(huì)有線程池來(lái)處理。
  4. 現(xiàn)在,內(nèi)部線程池(thread pool)可以處理很多請(qǐng)求,就像對(duì)數(shù)據(jù)庫(kù)請(qǐng)求,對(duì)文件的操作等等。
  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),移動(dòng)軟件開(kāi)發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)學(xué)習(xí)是年輕人改變自己的最好方式