好的,為了給出一些透視圖,讓我將node.js與Apache進(jìn)行比較。
Apache是一個多線程HTTP服務(wù)器,對于服務(wù)器接收的每個請求,它都會創(chuàng)建一個單獨(dú)的線程來處理該請求。
另一方面,Node.js是事件驅(qū)動的,從單個線程異步處理所有請求。
當(dāng)在Apache上接收到A和B時,將創(chuàng)建兩個處理請求的線程。每個單獨(dú)處理查詢,每個在服務(wù)頁面之前等待查詢結(jié)果。只有在查詢完成之前才能使用該頁面。由于服務(wù)器在收到結(jié)果之前無法執(zhí)行其余的線程,所以查詢FETCH處于阻塞狀態(tài)。
在節(jié)點(diǎn)中,C.Query是異步處理的,這意味著當(dāng)c.query為A獲取結(jié)果時,它跳到處理B的c.query,當(dāng)結(jié)果到達(dá)A時,將結(jié)果發(fā)送回調(diào),后者發(fā)送響應(yīng)。js知道在提取完成時執(zhí)行回調(diào)。
在我看來,因為它是一個單線程模型,所以無法從一個請求切換到另一個請求。
實際上,節(jié)點(diǎn)服務(wù)器一直都是這樣做的。要使開關(guān)(異步行為),您要使用的大多數(shù)函數(shù)都會有回調(diào)。
編輯
SQL查詢從MySQL圖書館。它實現(xiàn)回調(diào)樣式以及事件發(fā)射器來排隊SQL請求。它不異步執(zhí)行它們,這是由內(nèi)部利布夫提供非阻塞I/O抽象的線程:
- 打開到db的連接,就可以異步地建立連接本身。
- 連接db后,查詢將傳遞給服務(wù)器。查詢可以排隊。
- 主事件循環(huán)通過回調(diào)或事件得到完成通知。
- 主循環(huán)執(zhí)行回調(diào)/均衡器。
對http服務(wù)器的傳入請求以類似的方式處理。內(nèi)部線程體系結(jié)構(gòu)如下所示:
C+線程是執(zhí)行異步I/O(磁盤或網(wǎng)絡(luò))的libuv線程。主事件循環(huán)在將請求分派到線程池后繼續(xù)執(zhí)行。它可以接受更多的請求,因為它不等待或睡眠。SQL查詢/HTTP請求/文件系統(tǒng)讀取都是這樣發(fā)生的。