Node.js采用 事件驅(qū)動(dòng) 和 異步I/O 的方式,實(shí)現(xiàn)了一個(gè)單線程、高并發(fā)的運(yùn)行時(shí)環(huán)境,而單線程就意味著同一時(shí)間只能做一件事,那么Node.js如何利用單線程來(lái)實(shí)現(xiàn)高并發(fā)和異步I/O?本文將圍繞這個(gè)問(wèn)題來(lái)探討Node.js的單線程模型:
1、高并發(fā)
一般來(lái)說(shuō),高并發(fā)的解決方案就是多線程模型,服務(wù)器為每個(gè)客戶端請(qǐng)求分配一個(gè)線程,使用同步I/O,系統(tǒng)通過(guò)線程切換來(lái)彌補(bǔ)同步I/O調(diào)用的時(shí)間開(kāi)銷,比如Apache就是這種策略,由于I/O一般都是耗時(shí)操作,因此這種策略很難實(shí)現(xiàn)高性能,但非常簡(jiǎn)單,可以實(shí)現(xiàn)復(fù)雜的交互邏輯。
而事實(shí)上,大多數(shù)網(wǎng)站的服務(wù)器端都不會(huì)做太多的計(jì)算,它們只是接收請(qǐng)求,交給其它服務(wù)(比如從數(shù)據(jù)庫(kù)讀取數(shù)據(jù)),然后等著結(jié)果返回再發(fā)給客戶端。因此,Node.js針對(duì)這一事實(shí)采用了單線程模型來(lái)處理,它不會(huì)為每個(gè)接入請(qǐng)求分配一個(gè)線程,而是用一個(gè)主線程處理所有的請(qǐng)求,然后對(duì)I/O操作進(jìn)行異步處理,避開(kāi)了創(chuàng)建、銷毀線程以及在線程間切換所需的開(kāi)銷和復(fù)雜性。
延伸閱讀
- ssh框架 2016-09-30
- 阿里移動(dòng)安全 [無(wú)線安全]玩轉(zhuǎn)無(wú)線電——不安全的藍(lán)牙鎖 2017-07-26
- 消息隊(duì)列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 論文筆記【圖片目標(biāo)分割】 2017-07-26
- 詞向量-LRWE模型-更好地識(shí)別反義詞同義詞 2017-07-26
- 從棧不平衡問(wèn)題 理解 calling convention 2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明 2017-07-26
- Swift實(shí)現(xiàn)JSON轉(zhuǎn)Model - HandyJSON使用講解 2017-07-26
- 阿里移動(dòng)安全 Android端惡意鎖屏勒索應(yīng)用分析 2017-07-26
- 集合結(jié)合數(shù)據(jù)結(jié)構(gòu)來(lái)看看(二) 2017-07-26