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