標籤:

為什麼nodejs不需要IO功能?

七天學會NodeJS


事件驅動的服務模式是一個高性能的服務模型(無需為每個連接創建額外的上下文,非常節省資源開銷)。但是它有一個比較致命的弱點,就是主線程不能阻塞。一旦主線程存在阻塞,會導致這個服務模型的性能急劇下降。

同步IO就會導致線程的阻塞。對於有IO庫的編程語言來說,程序員的習慣會用運行時默認提供的那套API,而這套API基本都是同步IO,這種行為會讓精心設計的事件驅動模型瞬間喪失能力。所以Node選了JavaScript的一個原因是它不自帶IO庫,Node為它提供IO介面時也是默認使用非阻塞IO。


不是說nodejs不需要IO,而是說在設計node這個平台的時候,選擇的實現語言最好不要包含(同步)IO功能。

目的是為了避免歷史包袱


NodeJs是有IO的,沒有自帶的IO標準庫的是Javascript……

這一段是講為什麼NodeJs會選擇Javascript作為開發語言。

一般的編程語言在標準庫裡面都是帶一個IO模塊的,很不幸的是這個模塊通常是同步的……

同步IO對於各語言自身來說是很有必要的,但是對Node來說是毒藥。

所以Node選擇了沒有自帶IO的javascript。

Node里的默認IO操作也都是非同步的,同步操作用的是帶sync後綴的方法。


提問前提不成立,已經舉報不謝。


專門來答個題支持一下 @Twiknight 。

樓主的截圖是對 Node.js 一開始技術選型的說明,而且樓主的問題是帶有曲解的。

Node.js 是帶有 IO 功能的。但 js 作為一門編程語言是不帶有 io 功能的。js 只有語言規範,一開始主要是跑在瀏覽器中,而在瀏覽器中的 ajax 之類的行為,都是瀏覽器的 api,而非 js 本身的 api。

所以就 js 本身來說,並沒有規定或者說共識來決定,它在後端應該變現出怎樣的文件訪問行為或者網路訪問行為。這時候,node.js 的作者才方便賦予它這些行為。

假設一門語言的標準庫裡面已經有 io 庫了,在 2009 年的時候,這種 io 庫一般都是同步的。但大眾使用著這門語言默認的同步io庫,並且基於它開發了很多上層庫的時候,你突然搞個非同步的進去,會讓後來的編程很混亂。稍微一不注意就會阻塞整個進程的運作。python 在使用 tornado 的時候就很多這類同步 io 庫的問題需要注意。


一門後台語言 或者說 伺服器語言。 不支持io操作。 還叫伺服器語言嗎?

首先我們搞清楚什麼叫IO。

&> 課本定義 : I/O輸入/輸出(Input/Output),分為IO設備和IO介面兩個部分。

&> 通俗點 任何一個讀寫就算一次IO 其中包括(同步和非同步 阻塞 非阻塞)

我想作者想表達的是 ECMAScript這個語言默認不支持io讀寫操作。 (ajax 是瀏覽器提供的js介面,不屬於ECMAScript的內容)。 但是ECMAScript 語言本身的特性,讓他非常適合 做 非同步非阻塞 io讀寫操作。

強大的io,是nodejs最受歡迎之一


因為作者想自己實現非同步 IO,目前許多語言都是同步 IO。


Nodejs當然需要IO功能。

天然不帶IO功能的,是ECMAScript,也就是常說的JavaScript語言。

憑那個截圖是怎麼問出來這個問題的呢。。。。


你理解錯了

但是他需要選擇一種編程語言實現他的想法,這種編程語言不能自帶IO功能

「這種編程語言」指的是node.js的載體語言,JS沒有IO功能,所以JS就成了(作為node.js的載體語言)最好("天然")的選擇。


不是不要io 不要io還怎麼做web? 是不要同步io node優勢在於非同步非阻塞 這是 同步阻塞 同步非阻塞 非同步阻塞(io多路復用)非同步非阻塞 四種模式中 並發度最高的模式 為了迎合這種模式 node選擇不要同步io


這是在選擇基礎需要時。。就像你在學會中文後去學英語和你從出生在英語作為母語的國家之間的差別


js不帶io,但node帶,當然,也是非同步的。


這個理解有誤,這只是說NodeJS在選型的時候為什麼選擇JS,而不是別的語言?

因為JS自己沒帶IO,而別的語言要麼帶了IO,要麼不適合用來做事件驅動IO,於是選擇了JS。

為什麼要選一個不帶IO的語言呢?因為非同步IO是很反人類的,抖M才喜歡這。這也是為什麼即使用比較低層的語言比如C/C++,為了實現高並發的網路服務只能用IO多路復用/非同步IO,抖M們還是造了各種輪子來儘可能的讓事情變簡單點,甚至自己造一套協程出來。一門語言如果有了已經有了同步IO,願意用非同步IO的人就很少了,比如Python;如果剛好它又提供了協程之類的同步非阻塞,那非同步真是沒活路了,比如Go,方便省事兒出活快啊。

於是JS剛好是這麼一門語言:從天時上看,V8是一個高性能的JS虛擬機;從地利上看,JS不歡迎阻塞、不待見同步,從人和上看,JS還足夠流行。

JS又剛好是一個不帶IO的語言,於是只給非同步IO你也沒的選擇,要啥自行車啊,還照樣高呼非同步哲學,把非同步說得一套一套的,然後等async/await出來了又啪啪啪的打臉。


Nodejs這個平台是有IO功能的,並且提供JS形式的上層api,如果沒有IO是不可能實現哪怕一個最基本的web服務,更別提做網站了。

沒有IO的是js這門語言,因為起初js是為網頁腳本而生的,沒必要有IO能力,即使有,在網頁上IO操作也是越權的,不被瀏覽器允許的,所以的確沒有必要。


有io,

雖然nodejs是單線程的,但它的IO操作是多線程的,使通常情況的IO操作性能提高。

但是當IO操作情況比較複雜的時候,有可能造成線程競爭狀態,導致IO性能降低。

當同時有大量IO操作駐留在系統中時候,會增加內存開銷。所以~如題~


推薦閱讀:

前端領域流行的js版本控制方法,以及他們之間的區別?
Expressjs 生成的NodeJS網站,用「npm start」可以啟動訪問,forever 或者 pm2 可以啟動,但是無法訪問?
前端開發中的一些框架,插件,git使用真的很重要麼?
如何在docker里部署nodejs?
Node.js新手在哪兒找小項目練手?

TAG:Nodejs |