了不得的Node.js--之四

阻塞與非阻塞IOnode

絕大多數對node.js的討論都把關注點放在了其處理高併發的能力上。Node框架給開發者提供了構建高性能網絡應用的強大能力。網絡

我使用的開發工具是Mac版的WebStorm,這個工具支持Nodejs,只要按照以下步驟設置便可以支持併發

阻塞框架

嘗試區分下面PHP代碼和Node代碼有什麼不一樣:異步

PHP代碼示例:函數

//PHP
print('Hello');
sleep(5);
print('World');

Node代碼示例:高併發

//node
console.log('Hello');
setTimeout(function(){
console.log('World');
},5000);

上述代碼Node.js使用了回調函數,二者的區別集中在阻塞和非阻塞的區別上。工具

PHP sleep()阻塞了線程的執行,程序進入sleep時,就什麼事情都不作了。性能

而Node.js使用了事件輪詢,所以這裏setTimeout是非阻塞的。開發工具

若是在setTimeout後再加入console.log語句的話,該語句會被馬上執行:

console.log('Hello');
setTimeout(function(){
console.log('World');
});
console.log('Bye');

//這段腳本會輸出:
//Hello
//Bye
//World

採用了事件輪詢意味着什麼呢?從本質上說,Node會先註冊事件,隨後不停地詢問內核這些事件是否已經分發。當事件分發時,對應的回調函數就會被觸發,而後繼續執行下去。

若是沒有事件觸發,則繼續執行其它代碼,直到有新事件時,再去執行對應的回調函數。

和阻塞相反,setTimeout僅僅只是註冊了一個事件,而程序繼續執行,因此,這是異步的。

Node併發實現也採用了事件輪詢。與timeout所採用的技術同樣,全部像http、net這樣的原生模塊中IO部分也都採用了事件輪詢技術。和timeout機制中Node內部會不停地等待,

並當超時完成時,觸發一個消息通知同樣,Node使用事件輪詢,觸發一個和文件描述符相關的通知。

相關文章
相關標籤/搜索