既然 Node.js 是單線程,又是怎麼做到支持非同步函數調用的?

單線程與非同步、並發不是矛盾對立的么?


JS的主進程調用棧是同步的(單線程,一次只能做一件事)

非同步調用把回調加入一個隊列,等待主棧空閑

主棧空閑,Event觸發,Event Loop機制把隊列里排在前面的回調壓入主棧


請參考這篇博客,http://debuggable.com/posts/understanding-node-js:4bd98440-45e4-4a9a-8ef7-0f7ecbdd56cb

That"s right, everything runs in parallel, except your code. To understand that, imagine your code is the king, and node is his army of servants.


單線程指的是主線程是「單線程」的,所有阻塞的部分交給一個線程池處理,然後這個主線程通過一個隊列跟線程池協作,於是對我們寫到的js代碼部分,不再關心線程問題,代碼也主要由一堆callback回調構成,然後主線程在不停的循環過程中,適時調用這些代碼。


是的 Node.js是單線程 但是單線程與非同步不會矛盾 與並發是矛盾的

我理解題主你的意思...

例子:

var sleep = require("sleep").sleep
setTimeout(function(){
console.log(1);
}, 998);
setTimeout(function(){
sleep(30);
}, 999);
setTimeout(function(){
console.log(3);
}, 1000);


消息循環。所有語句執行完畢後會進入消息循環等待下一個事件,類似於select/poll實現的單線程並發。


除了你的代碼是單線程,其餘都是多線程(線程池),nodejs本身是事件驅動,一個io事件完成會被放到一個事件隊列中,主線程負責輪訓這個隊列,然後執行相應的回調函數。


node.js - 既然nodejs是單線程的,那麼它怎麼處理並發,難道要排隊么 - SegmentFault


在nodejs的文檔里有較清楚的描寫,首先給需要非同步的函數一個callbackFunction(),然後當非同步函數執行完後就會去調用這個callbackFunction, 注意那個中文的nodejs手冊翻譯有誤。javascript是一種事件驅動語言。


代碼在解釋後始終放到一個線程中執行,代碼本身不能創建和管理線程,解釋器負責根據事件來調度js代碼


顯然JavaScript有個運行隊列,eventloop就這樣一直循環


我覺得,沒必要稀罕現在的又時髦起來的非同步這個東西。

GUI的架構不就是非同步的嗎?

GUI軟體中的按鈕事件等,不就是回調么?


推薦閱讀:

vuejs怎麼在伺服器部署?
node.js和前端js有什麼區別?需要重新學習嗎?
typescript調用js(node)組件,必須在每一個引用的地方都寫reference嗎?
前後端使用同一種編程語言有什麼優勢和劣勢?
為什麼說nodejs是前端必備技能?

TAG:Nodejs | 並發峰值 | 單線程 |