經過兩段代碼理解阻塞IO和非阻塞IO

首先你們來看一段PHP的代碼異步

一樣的代碼咱們在Node.js中如何實現?函數

上述兩端代碼不單單是語義上的區別,咱們能夠發現Node.js使用了回調函數。二者最主要的區別就體如今阻塞和非阻塞上。線程

第一個案例中PHP的代碼,sleep(5);阻塞了線程的執行,換句話說當程序進入睡眠的時候就什麼都不會作了。blog

第二個案例中Node.js代碼,使用了時間輪詢機制,不會阻塞當前的線程,這裏的setTimeout是非阻塞的,再換句話說,若是在setTimeout以後再加入一條輸出語句,會被馬上執行。事件

執行結果以下:回調函數

Node.js採用事件輪詢意味着什麼呢?同步

從本質上說Node會先註冊事件,而後會不停的詢問該事件是否已經分發。當事件分發是,對應的回調函數就會被觸發,而後繼續執行下去。若是事件沒有被分發,就會繼續執行其餘代碼,不會被阻塞。ejs

因此從以上的分析能夠看出,PHP的處理方式是阻塞的,因此是同步的,而Nodejs的處理方式是非阻塞的,因此是異步的。程序

講到這相信你們對阻塞IO和非阻塞IO有了一個最基本的瞭解。im

 

thanks

Jack

相關文章
相關標籤/搜索