摘要:特性單線程說(shuō)明也許你會(huì)問(wèn),為什么還不安裝還不寫(xiě)代碼還不講模塊前面我說(shuō)過(guò),不會(huì)一來(lái)就。另外,單線程中,操作系統(tǒng)沒(méi)有創(chuàng)建銷毀線程的時(shí)間開(kāi)銷。單線程缺點(diǎn)如果有用戶造成線程崩潰,那個(gè)整個(gè)系統(tǒng)都崩潰了。
nodejs特性1--單線程
說(shuō)明:也許你會(huì)問(wèn),為什么還不安裝nodejs?還不寫(xiě)代碼?還不講模塊?前面我說(shuō)過(guò),不會(huì)一來(lái)就hello world。而是會(huì)先跟大家講講nodejs的特點(diǎn),只有大家明白、理解nodejs的特點(diǎn),在后面的模塊學(xué)習(xí)中,會(huì)有種豁然開(kāi)朗的感覺(jué),也會(huì)更加明白為什么nodejs會(huì)這樣設(shè)計(jì);比起一上來(lái)就看文檔、寫(xiě)代碼更加事半功倍;比起代碼層面的東西,原理更為重要!
在php,java語(yǔ)言中,會(huì)為每一個(gè)客戶端連接都創(chuàng)建一個(gè)新的線程。以php(php-fpm、單進(jìn)程單線程)為例,每一個(gè)php-fpm工作線程大概消耗20M內(nèi)存,一個(gè)8G的服務(wù)器,大概同時(shí)支持400個(gè)左右客戶端連接。要想支持更加多的客戶端連接,只能增加服務(wù)器數(shù)量,這樣一來(lái)硬件的費(fèi)用成本就上來(lái)了。
在nodejs始終只有唯一一個(gè)線程,它不為每一個(gè)客戶端的連接新開(kāi)線程。據(jù)某些測(cè)試,一個(gè)8G內(nèi)存的服務(wù)器同時(shí)支持4萬(wàn)了連接。nodejs通過(guò)自己內(nèi)部事件機(jī)制、異步I/O,在宏觀上達(dá)到并行。
例子說(shuō)明:
如一個(gè)任務(wù)中有3個(gè)線程;
在多線程中(圖1),它3個(gè)線程是同時(shí)并行的,但由于每個(gè)線程中都有I/O操作,都要等阻塞I/O完成后才能進(jìn)行下面的程序。
圖1
在Nodejs單線程中,首先會(huì)把所有要執(zhí)行的線程放到“事件?!敝校陂_(kāi)始執(zhí)行第一個(gè)線程后,遇到I/O時(shí),會(huì)馬上把當(dāng)前的I/o操作放到事件棧中并開(kāi)始執(zhí)行線程2;當(dāng)線程1的I/O執(zhí)行完成后,程序會(huì)回到線程1,并執(zhí)行線程1的程序2;當(dāng)線程2中遇到I/O,也會(huì)放到事件棧中;程序轉(zhuǎn)而去處理其他;就是這樣的循環(huán),讓程序達(dá)到并行效果,這個(gè)線程的利用率是100%的。
圖2
如果你還不明白的話,我們可以用生活的例子來(lái)進(jìn)一步說(shuō)明:餐廳和服務(wù)員的關(guān)系;多線程--招很多個(gè)服務(wù)員,每個(gè)服務(wù)員干特定的活(點(diǎn)菜、沖茶、收桌子),干完自己的活后可以休息;而單線程--只招了一個(gè)服務(wù)員,所有的活都有他自己一個(gè)人干,干什么他自己決定,甚至點(diǎn)菜干到一半,去把沖茶干完后,再回來(lái)繼續(xù)點(diǎn)菜也可以。
另外,單線程中,操作系統(tǒng)沒(méi)有創(chuàng)建、銷毀線程的時(shí)間開(kāi)銷。
單線程缺點(diǎn):如果有用戶造成線程崩潰,那個(gè)整個(gè)系統(tǒng)都崩潰了。(不過(guò)nodejs很難崩潰,會(huì)有相應(yīng)的錯(cuò)誤事件處理)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/93149.html
摘要:事件驅(qū)動(dòng)在中,當(dāng)某個(gè)執(zhí)行完畢后,會(huì)以事件的形式通知執(zhí)行操作的線程而線程去執(zhí)行對(duì)應(yīng)事件的回調(diào)函數(shù)。為了處理異步,線程必須要有事件循環(huán),不斷的檢查有沒(méi)有事件要處理,并依次處理。其實(shí)在底層中,有一半的代碼,都是在處理事件隊(duì)列回調(diào)函數(shù)。 事件驅(qū)動(dòng) 上一節(jié)中,我們提到異步I/O;當(dāng)I/O處理完畢后,nodejs是怎樣知道I/O已經(jīng)完成了呢?又是怎樣去處理的呢?答案是:事件驅(qū)動(dòng)(事件循環(huán))機(jī)制。 ...
摘要:非阻塞下面我們繼續(xù)看看的第個(gè)特性非阻塞異步首先,看看什么是非阻塞呢操作,在程序中我們可以廣泛的認(rèn)為是從數(shù)據(jù)庫(kù)讀數(shù)據(jù)從硬盤(pán)上讀寫(xiě)文件等。當(dāng)處理完畢后,是怎樣知道該完成了這里就要說(shuō)到第個(gè)特性了事件驅(qū)動(dòng)。 非阻塞I/O 下面我們繼續(xù)看看,nodejs的第2個(gè)特性--非阻塞I/O(異步I/O) 首先,看看什么是非阻塞I/O呢?I/O操作,在程序中我們可以廣泛的認(rèn)為是:從數(shù)據(jù)庫(kù)讀數(shù)據(jù)、從硬盤(pán)上讀...
摘要:是什么官網(wǎng)上的定義翻譯過(guò)來(lái)是一個(gè)基于引擎的運(yùn)行環(huán)境。使用了一個(gè)事件驅(qū)動(dòng)非阻塞式的模型,使其輕量又高效。的包管理器,是全球最大的開(kāi)源庫(kù)生態(tài)系統(tǒng)。的特點(diǎn)非常重要單線程事件驅(qū)動(dòng)事件循環(huán)非阻塞異步所謂的特點(diǎn),就是是怎樣解決服務(wù)器高性能的問(wèn)題。 nodejs是什么 nodejs官網(wǎng)(nodejs.org)上的定義:Node.js? is a JavaScript runtime built on...
摘要:基礎(chǔ)篇整合最近有朋友也想學(xué)習(xí)相關(guān)方面的知識(shí),如果你是后端想接近前端,作為一門(mén)跑在服務(wù)端的語(yǔ)言從這里入門(mén)再好不過(guò)了。事件驅(qū)動(dòng)機(jī)制是通過(guò)內(nèi)部單線程高效率地維護(hù)事件循環(huán)隊(duì)列來(lái)實(shí)現(xiàn)的,沒(méi)有多線程的資源占用和上下文的切換。 nodeJs 基礎(chǔ)篇整合 最近有朋友也想學(xué)習(xí)nodeJs相關(guān)方面的知識(shí),如果你是后端想接近前端,node作為一門(mén)跑在服務(wù)端的JS語(yǔ)言從這里入門(mén)再好不過(guò)了。如果你正好喜歡前端,...
摘要:基礎(chǔ)篇整合最近有朋友也想學(xué)習(xí)相關(guān)方面的知識(shí),如果你是后端想接近前端,作為一門(mén)跑在服務(wù)端的語(yǔ)言從這里入門(mén)再好不過(guò)了。事件驅(qū)動(dòng)機(jī)制是通過(guò)內(nèi)部單線程高效率地維護(hù)事件循環(huán)隊(duì)列來(lái)實(shí)現(xiàn)的,沒(méi)有多線程的資源占用和上下文的切換。 nodeJs 基礎(chǔ)篇整合 最近有朋友也想學(xué)習(xí)nodeJs相關(guān)方面的知識(shí),如果你是后端想接近前端,node作為一門(mén)跑在服務(wù)端的JS語(yǔ)言從這里入門(mén)再好不過(guò)了。如果你正好喜歡前端,...
閱讀 695·2021-11-23 09:51
閱讀 3288·2019-08-30 15:54
閱讀 448·2019-08-30 15:52
閱讀 3121·2019-08-30 13:58
閱讀 2924·2019-08-30 13:53
閱讀 2692·2019-08-29 14:18
閱讀 2425·2019-08-27 10:54
閱讀 2372·2019-08-26 18:09