阻塞與非阻塞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使用事件輪詢,觸發一個和文件描述符相關的通知。