Node.js采用 事件驅(qū)動 和 異步I/O 的方式,實(shí)現(xiàn)了一個單線程、高并發(fā)的運(yùn)行時環(huán)境,而單線程就意味著同一時間只能做一件事,那么Node.js如何利用單線程來實(shí)現(xiàn)高并發(fā)和異步I/O?本文將圍繞這個問題來探討Node.js的單線程模型:
1、高并發(fā)
一般來說,高并發(fā)的解決方案就是多線程模型,服務(wù)器為每個客戶端請求分配一個線程,使用同步I/O,系統(tǒng)通過線程切換來彌補(bǔ)同步I/O調(diào)用的時間開銷,比如Apache就是這種策略,由于I/O一般都是耗時操作,因此這種策略很難實(shí)現(xiàn)高性能,但非常簡單,可以實(shí)現(xiàn)復(fù)雜的交互邏輯。
而事實(shí)上,大多數(shù)網(wǎng)站的服務(wù)器端都不會做太多的計(jì)算,它們只是接收請求,交給其它服務(wù)(比如從數(shù)據(jù)庫讀取數(shù)據(jù)),然后等著結(jié)果返回再發(fā)給客戶端。因此,Node.js針對這一事實(shí)采用了單線程模型來處理,它不會為每個接入請求分配一個線程,而是用一個主線程處理所有的請求,然后對I/O操作進(jìn)行異步處理,避開了創(chuàng)建、銷毀線程以及在線程間切換所需的開銷和復(fù)雜性。