確實,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停止。
如果需要很長時間的人做很多同步事情,是的,你會遇到問題,但如果它是異步的,比如讀取文件或寫入文件,其他請求將繼續處理等待異步操作完成。 JavaScript在事件循環中運行。因此,您應該避免在爲請求提供服務的node.js應用程序上使用同步操作。 – 2014-10-17 18:24:04
@KevinB是的,我知道別人會被處理,如果我使用異步。但我的問題是,因爲它是單線程的,所以如果處理其他請求需要更短的時間,那麼在此期間不處理較長時間的請求。糾正我,如果我錯了。然後有很多較短的時間請求會導致較長的時間請求不被執行。並且需要更多時間來完成更長的請求。是對的嗎? – adiggo 2014-10-17 18:27:53
這是一個比喻。 Node.js是一個國王。他坐在他的寶座上,僕人進來尋求答覆。國王一次只聽到一個請求,並且一次只響應一次。但是,他有很多僕人來做他的工作。僕人A立即進入僕人B,國王聽僕人A,然後派他去喝咖啡。然後,他聽到僕人B的聲音,並派他打開窗戶。如果僕人B在僕人A之前回來,僕人B將首先被解僱,而國王仍在等待僕人A.當僕人A回來後,國王將解僱他。2. – 2014-10-17 18:31:54