2012-04-09 56 views
2

我讀到JavaScript語言具有幫助實現非阻塞IO的特性,這有助於成功執行諸如node.js之類的項目。我的問題是這些特性是什麼,以及爲什麼非阻塞IO更難以在其他語言中實現?非阻塞IO如何在javascript中工作

+1

是怎樣寫的?就我所知,異步I/O是一個特定於節點的擴展(儘管它確實使用純JS接口)。 – delnan 2012-04-09 16:35:34

+1

該語言不提供非阻塞IO。但是,某些框架可以。 – Cameron 2012-04-09 16:36:13

+0

你能提供你閱讀的文件嗎?也許它們意味着語言語法和語義提供了非阻塞IO。 – 2012-04-09 16:37:08

回答

5

有時將javascript標記爲非阻塞IO的原因是由於匿名定義(基於事件)功能的概念。 Node.js專門將這個標籤標記爲他們爲什麼說javascript是一種很好的服務器端語言。然而,這只是一個事實,因爲它在技術上不是非阻塞的,但它將繼續執行代碼,同時等待來自匿名回調/ ajax函數的回調。我不確定這是否是您閱讀的內容,但在一個Node教程中提供的解釋是:

「另一種方法,由Node和一些非常快速的現代服務器(如Nginx和Thin)採用的方法是在事件循環中使用單個非阻塞線程,這是使用JavaScript的決定真正出現的地方,因爲JavaScript被設計用於基於單線程事件循環的環境:瀏覽器JavaScript能夠傳遞閉包基於事件的編程很簡單,你基本上只是調用一個函數來執行某種類型的I/O並將其傳遞給一個回調函數,JavaScript會自動創建一個閉包,確保即使在調用函數已經很長時間之後仍然保持正確的狀態超出了範圍。「

來源:http://net.tutsplus.com/tutorials/javascript-ajax/this-time-youll-learn-node-js/

關於你的多線程標籤的Node.js和Javascript是多線程的,他們使用封閉的系統,以保持狀態,同時等待回調。因此,他們是完全非阻塞。有很多情況下會發生阻塞,但對於大多數小型實現,開發人員永遠不會遇到阻塞情況。

在這裏看到爲什麼node.js的是壞的可能的信息:http://teddziuba.com/2011/10/node-js-is-cancer.html(鏈接斷開)

,並在這裏爲rebuttle:http://rhyolight.posterous.com/nodejs-is-not-cancer(鏈接斷開)

+1

癌症鏈接和非癌症鏈接都死了我 – 2015-06-21 20:23:41

+0

對不起。我會嘗試搜索文章標題,看看它們是否存檔在某個地方。這些鏈接都是私人博客,所以我認爲可以安全地假設他們會在3年後遷移。 – Jlange 2015-06-22 17:08:37

+0

另外,Node.js是多線程的 - 所有I/O調用都發生在與主事件循環線程不同的線程上 – 2015-06-22 18:25:13

1

異步函數通常是基於JavaScript的事件,這意味着註冊回調處理程序。您的代碼在註冊後運行,但不等待事件 - 必須從處理程序調用事件後才能完成的所有事件。我希望這一切都說。

當然,在瀏覽器中也有例外,如window.alert/confirm/prompt

+1

node.js是基於事件的;瀏覽器是基於事件的; JavaScript不關心。 – Amadan 2012-04-09 16:44:39

+0

好的,那是真的。 Ecmascript規範本身並沒有告訴我們關於事件的任何信息,但是一流的函數和閉包讓回調變得非常容易。 – Bergi 2012-04-09 16:59:11

6

JavaScript本身不提供非阻塞IO。底層系統調用node.js使用的非阻塞IO。 JavaScript的一流功能意味着在IO完成時很容易傳回回調。

其他語言可以做非阻塞IO就好了。 node.js只是認爲回調使得它非常容易推理和處理非阻塞操作。

Ruby有EventMachine,它可以傳遞塊而不是函數。 C可以使用函數指針來實現非阻塞IO,但是你不會得到閉包,所以它更加痛苦。