2014-10-17 66 views
4

我是目前正在學習它的nodejs的新手。 我知道nodejs是單線程,但我想知道:如果我使用非阻塞方法,例如 ,有20000個併發請求,並且有一個請求需要很長時間,其他線程需要更短的時間。 所以一旦我們遇到了較長的時間請求,nodejs會說「嗨,請暫停,其他請求需要使用」,nodejs是否有默認時間來檢測是否需要暫停?糾正我,如果我使用錯誤的詞「puase」(因爲我認爲,因爲它是單線程,所以它應該停止計算一個請求,如果另一個請求要處理。)。 在我假設的情況下,那麼較長的請求需要很多時間才能處理?nodejs單線程?如果有很多併發請求,它是如何工作的

感謝您的幫助。

+0

如果需要很長時間的人做很多同步事情,是的,你會遇到問題,但如果它是異步的,比如讀取文件或寫入文件,其他請求將繼續處理等待異步操作完成。 JavaScript在事件循環中運行。因此,您應該避免在爲請求提供服務的node.js應用程序上使用同步操作。 – 2014-10-17 18:24:04

+0

@KevinB是的,我知道別人會被處理,如果我使用異步。但我的問題是,因爲它是單線程的,所以如果處理其他請求需要更短的時間,那麼在此期間不處理較長時間的請求。糾正我,如果我錯了。然後有很多較短的時間請求會導致較長的時間請求不被執行。並且需要更多時間來完成更長的請求。是對的嗎? – adiggo 2014-10-17 18:27:53

+1

這是一個比喻。 Node.js是一個國王。他坐在他的寶座上,僕人進來尋求答覆。國王一次只聽到一個請求,並且一次只響應一次。但是,他有很多僕人來做他的工作。僕人A立即進入僕人B,國王聽僕人A,然後派他去喝咖啡。然後,他聽到僕人B的聲音,並派他打開窗戶。如果僕人B在僕人A之前回來,僕人B將首先被解僱,而國王仍在等待僕人A.當僕人A回來後,國王將解僱他。2. – 2014-10-17 18:31:54

回答

7

確實,node.js一次只能接收或響應一個請求,但它可以同時處理多個請求。

例如,假設您有一個node.js應用程序,它是一個休息API,並且每個請求都會導致除端點C以外的對數據庫的調用。其餘API有3個端點。

端點A:需要3秒,聊到數據庫

端點B:需要2秒,聊到數據庫

端點C:不說話的數據庫,它只是返回靜態文本。

超過1個請求不可能同時發生。無論時間戳有多接近,總是首先。現在

,可以說,我們有10個請求在同一時間發生的事情,在這個順序:

ABCBCCAABC

下面是他們將如何收到並回復:

REC:A 
REC:B 
REC:C 
RESP:C 
REC:B 
REC:C 
RESP:C 
REC:C 
RESP:C 
REC:A 
REC:A 
REC:B 
REC:C 
RESP:C 
// 2 seconds later 
RESP:B 
RESP:B 
RESP:B 
// 1 second later 
RESP:A 
RESP:A 
RESP:A 

C時,同時立即發生,因爲它不會執行任何異步操作。然後您收到全部的B,然後全部爲A,因爲B比A快。

雖然基於數據庫設置,但B和A的順序可能會有所不同,例如,如果它被設置爲僅處理x時間。

如果我們引進和進行同步的行動,花費6秒終點d,你會得到這樣的結果:因爲d停止所有的JavaScript處理,而它的同步動作需要

ADABC

REQ:A 
REQ:D 
// 6 long seconds later... 
RESP:D 
REQ:A 
REQ:B 
REQ:C 
RESP:C 
// 2 seconds later... 
RESP:B 
// 1 second later... 
RESP:A 
RESP:A 

地點。執行同步操作的1個端點對於某個人來說可能會導致您的api停止。

+0

+1不錯,易於消化的答案! – 2014-10-17 19:40:08

+0

太好了。我懂了。但我有一個問題。與其他語言的「在新請求進入後使用新線程」相比,有什麼優勢呢?我發現它們之間的區別在於I/O部分。但是,有什麼優勢 – adiggo 2014-10-17 20:42:48

+0

我認爲我不能真正回答,並且我懷疑這是一個「乾枯」的答案,因爲每種方法都有其自身的優點/缺點。 – 2014-10-17 20:44:20

相關問題