學習和使用Node.js已經有兩個月,使用express結合mongoose寫了一個web應用和一套RESTful web api,回過頭來看Node.js官網首頁對Node.js的介紹:Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient.那麼其中的non-blocking I/O model 意味著什麼呢?
非阻塞的IO模型
首先,IO操作無疑是耗時的,當伺服器端接收到大量請求時,為每個請求創建進程或線程的同時,也增加了額外的記憶體開銷,也可能浪費更多的時間資源。
由於Node.js是事件驅動的,於是它使用了事件循環來解決IO操作帶來的瓶頸問題。在Node.js中,一個IO操作通常會帶有一個回呼函數,當IO操作完成並傳回時,就會呼叫這個回呼函數,而主執行緒則繼續執行接下來的程式碼。簡單的用一個例子來說明這個問題:
request('http://www.google.com', function(error, response, body) { console.log(body); }); console.log('Done!');
這段程式碼的意思是向'http://www.google.com'發出請求,當請求返回這則呼叫回呼函數輸出回應訊息。由於Node.js的運作機制,這段程式碼運行後,會立即在控制台輸出'Done!',然後一段時間後再輸出回應的資訊。
事件循環 event loop
接下來,來討論下事件循環的機制。首先說說呼叫桟,例如有以下一段程式碼:
function A(arg, func){ var a = arg; func(); console.log('A'); } function B(){ console.log('B'); } A(0, B);
當程式碼執行後,函數A先被推入呼叫桟中成為棧頂元素並開始執行A,在執行過程中函數B又被推入呼叫桟成為棧頂元素,在B執行完成後,B被彈出呼叫桟,A再次成為棧頂元素,在A執行完成後A被彈出調用桟,呼叫桟呈空閒狀態。
在Javascript運行時中存在一個訊息佇列,而訊息和一個回呼函數相關聯,當一個事件被觸發時,如果這個事件有對應的回呼函數,則該訊息就會被加入到訊息佇列中去。
回過頭來說事件循環到底循環的是什麼,在程式碼開始執行後,函數被不斷推入呼叫桟中,就拿上面的例子來講,request被推入呼叫桟中,這個函數將進行一個http請求(這個http請求將交由Node.js的底層模組來實現)同時請求完成的事件和一個回調函數關聯起來,request被彈出調用桟,console.log被推入調用桟開始執行。當請求完成時,完成事件被觸發,一則訊息被加入到訊息佇列中,訊息佇列首先會檢查呼叫桟是否為空閒狀態,如果呼叫桟並不空閒,則會一直等待到呼叫桟空閒狀態後,將訊息佇列的頭部彈出,此時與該訊息相關聯的回呼函數被執行。
小結
以上就無阻塞模型和事件循環在概念上進行了總結。而這個事件循環的機制並不僅僅是Node.js所獨有的,而且Node.js的程式碼是單執行緒執行的,在面對大量並發請求的時候,又有著什麼優勢呢?
上面這張圖展示了Node.js的架構圖,Node.js的底層有一個模組負責維護線程池,當一個IO請求發出的時候,Node.js的底層模組將新建一個線程來處理請求,完成後再將結果交還給上層。那麼,當有多個請求的時候,Node.js的底層模組將利用盡可能少的線程來完成最多的任務,如果存在空閒的線程,它將繼續被利用來做其他的事情,這對於前面說的針對每個請求開一個新的進程或線程而言,無疑「聰明」許多,也更有效率了。
這篇文章是對學習Node.js的一個總結,其中若有問題和不足,歡迎批評指正。

引言我知道你可能會覺得奇怪,JavaScript、C 和瀏覽器之間到底有什麼關係?它們之間看似毫無關聯,但實際上,它們在現代網絡開發中扮演著非常重要的角色。今天我們就來深入探討一下這三者之間的緊密聯繫。通過這篇文章,你將了解到JavaScript如何在瀏覽器中運行,C 在瀏覽器引擎中的作用,以及它們如何共同推動網頁的渲染和交互。 JavaScript與瀏覽器的關係我們都知道,JavaScript是前端開發的核心語言,它直接在瀏覽器中運行,讓網頁變得生動有趣。你是否曾經想過,為什麼JavaScr

Node.js擅長於高效I/O,這在很大程度上要歸功於流。 流媒體匯總處理數據,避免內存過載 - 大型文件,網絡任務和實時應用程序的理想。將流與打字稿的類型安全結合起來創建POWE

Python和JavaScript在性能和效率方面的差異主要體現在:1)Python作為解釋型語言,運行速度較慢,但開發效率高,適合快速原型開發;2)JavaScript在瀏覽器中受限於單線程,但在Node.js中可利用多線程和異步I/O提升性能,兩者在實際項目中各有優勢。

JavaScript起源於1995年,由布蘭登·艾克創造,實現語言為C語言。 1.C語言為JavaScript提供了高性能和系統級編程能力。 2.JavaScript的內存管理和性能優化依賴於C語言。 3.C語言的跨平台特性幫助JavaScript在不同操作系統上高效運行。

JavaScript在瀏覽器和Node.js環境中運行,依賴JavaScript引擎解析和執行代碼。 1)解析階段生成抽象語法樹(AST);2)編譯階段將AST轉換為字節碼或機器碼;3)執行階段執行編譯後的代碼。

Python和JavaScript的未來趨勢包括:1.Python將鞏固在科學計算和AI領域的地位,2.JavaScript將推動Web技術發展,3.跨平台開發將成為熱門,4.性能優化將是重點。兩者都將繼續在各自領域擴展應用場景,並在性能上有更多突破。

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。

是的,JavaScript的引擎核心是用C語言編寫的。 1)C語言提供了高效性能和底層控制,適合JavaScript引擎的開發。 2)以V8引擎為例,其核心用C 編寫,結合了C的效率和麵向對象特性。 3)JavaScript引擎的工作原理包括解析、編譯和執行,C語言在這些過程中發揮關鍵作用。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

禪工作室 13.0.1
強大的PHP整合開發環境