在讀這篇博客之前,我強列建議先閱讀我的前兩篇文章:
- Getting Started With Node.js
-
在這篇文章中,我們將學習 Node.js 中的事件循環(huán)(event loop)。我們還將了解 Node.js 的代碼執(zhí)行過程。在我第一篇文章中我告訴大家 Node.js 是一個單線程的應用程序。因為 Node.js 運行的是 JavaScript,然而 JavaScript 是不支持多線程的,所以 Node.js 也不支持多線程。但是 Node.js 使用事件和回調(diào)(event and callbacks)的概念可以支持并發(fā)。這一切歸咎都是事件循環(huán)(event loop)的功勞。
事件循環(huán)(event loop)的工作機制
在 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í)行過程,讓我們來一步一步理解它。
- 每當請求進入 Node.js 的 API 時將會被添加到事件循環(huán)(event loop)的隊列,因為 Node.js 不能同時處理多個請求。所以,所有的請求進來后將會被添加到事件隊列里面。
- 現(xiàn)在,你可以在上圖中看到一個循環(huán),它總是檢查事件或請求是否在事件隊列中可用。如果有任何請求可用,那么根據(jù)隊列的“先進先出”的特性,該請求將會被處理。
- Node.js 的事件循環(huán)(event loop)是單線程執(zhí)行的非阻塞 I/O 任務。它將請求發(fā)送到 C++ 內(nèi)部線程池(thread pool),里面可以運行大量的線程任務。這個內(nèi)部 C++ 線程池(thread pool)是 Libev 組件中開發(fā)的事件循環(huán)(event loop)的一部分,它可以處理多個請求。事件循環(huán)一直檢查事件隊列中是否存在任務,如果有并且阻塞進程存在,將會有線程池來處理。
- 現(xiàn)在,內(nèi)部線程池(thread pool)可以處理很多請求,就像對數(shù)據(jù)庫請求,對文件的操作等等。