簡體   English   中英

了解NodeJS和非阻塞IO

[英]Understanding NodeJS & Non-Blocking IO

所以,我最近注射了Node病毒,它正在編程世界中迅速傳播。

我對它的“非阻塞IO”方法很着迷,並且我自己也試過了幾個程序。

但是,我目前無法理解某些概念。

我需要外行術語的答案(有人來自Java背景)

1.多線程和非阻塞IO。

讓我們考慮一個實際的場景。 比如,我們有一個用戶可以注冊的網站。 下面是代碼。

..
..
   // Read HTTP Parameters
   // Do some Database work
   // Do some file work
   // Return a confirmation message
..
..

在傳統的編程語言中,上述順序發生。 並且,如果有多個注冊請求,則Web服務器會創建一個新線程,其余的都是歷史記錄。 當然,程序員可以創建自己的線程,同時在第2行和第3行上工作。

在Node中,據我所知,第2行和第3行將並行運行,而程序的其余部分將被執行,解釋器每隔'x'ms輪詢第2行和第3行。

現在,我的問題是,如果Node是單線程語言,那么在執行程序的其余部分時,第2行和第3行的工作是什么?

2.可擴展性

我最近讀到LinkedIn已經將Node作為其移動應用程序的后端進行了調整,並且已經看到了巨大的改進。

任何人都可以解釋它是如何產生這樣的差異的?

3.適應其他編程語言

如果人們聲稱Node在性能方面有很大的不同,為什么其他編程語言沒有采用這種非阻塞IO范例呢?

我確定我錯過了什么。 只有你能解釋我並指導我一些鏈接,才會有所幫助。

謝謝。

提出了類似的問題,可能包含了您正在尋找的所有信息: 單線程非阻塞IO模型如何在Node.js中工作

但我將簡要介紹你的3個部分:

1。
第2行和第3行的形式非常簡單,如下所示:
db.query(...,function(query_data){...});
fs.readFile('/ path / to / file',function(file_data){...});

現在函數(query_data)和函數(file_data)是回調函數。 函數db.query和fs.readFile將發送實際的I / O請求,但回調允許處理來自數據庫或文件的數據,直到收到響應為止。 它並不真正“輪詢第2和第3行”。 回調被添加到事件循環中,並與其各自的I / O事件的某些文件描述符相關聯。 然后輪詢文件描述符以查看它們是否准備好執行I / O. 如果是,則使用I / O數據執行回調函數。

我認為“除了代碼之外,所有內容並行運行”這一短語總結得很好。 例如,“讀取HTTP參數”之類的內容將按順序執行,但第2行和第3行中的I / O函數與添加到事件循環並稍后執行的回調相關聯。 所以基本上重點是它不必等待I / O.

2。
由於1中解釋的內容,Node可以很好地擴展I / O密集型請求,並允許許多用戶同時連接。 它是單線程的,因此它不一定適用於CPU密集型任務。

3。
這個范例已經與JavaScript一起使用,因為JavaScript支持回調,事件循環和閉包,這使得這很容易。 其他語言不一定如此。

我可能會稍微離開,但這是正在發生的事情的要點。

Q1。 “在執行程序的其余部分時,第2行和第3行的工作是什么?” 答:“沒什么”。 第2行和第3行各自自己開始各自的工作,但這些工作不能立即完成,因為(例如)尚未加載所需的磁盤扇區 - 所以操作系統發出調用磁盤去獲取那些扇區,然后“沒有任何事情發生”(節點繼續執行它的下一個任務),直到磁盤子系統(稍后)發出中斷報告它們已准備就緒,此時節點將控制權返回到第2行和第3行。

Q2。 單線程非阻塞幾乎沒有資源到每個傳入連接(只是一些關於連接套接字的內務數據)。 它的內存效率非常高。 傳統的Web服務器“分叉”一個全新的進程來處理每個新連接 - 這意味着需要對所需的每一段代碼和數據變量進行大量復制,並對CPU進行時間分片處理。 這大量浪費資源。 因此 - 如果你的負載是很多等待東西的空閑連接,那么節點使得負載更有意義。

Q3。 如果你想使用它,幾乎每種編程語言都有非阻塞I / O. Node不是一種編程語言,它是一個運行javascript並使用非阻塞I / O的Web服務器(例如:我個人在10年前在perl中編寫了我自己的相同內容,就像google(在C中)開始時一樣,並且我確信其他人也有類似的Web服務器。 非阻塞I / O並不是困難的部分 - 讓程序員了解如何使用它是一個棘手的問題。 Javascript恰好適用於此,因為那些程序員已經熟悉事件編程。

即使node.js已經存在了幾年,它的性能模型仍然有點神秘。

我最近創建了一個博客,並認為node.js模型將是一個很好的第一個主題,因為我想自己更好地理解它,並且有助於其他人分享我學到的東西。 以下是我寫的幾篇文章,解釋了高級概念和一些權衡:

阻塞與非阻塞I / O - 發生了什么?

了解node.js性能

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM