簡體   English   中英

Node.js性能事件循環

[英]Nodejs performance event loop

文章聲稱由於其單線程事件循環而具有出色的nodejs性能。 我不是要征求意見,而是要提供力學解釋

線程開始處理請求,進行一點計算,然后發現需要從數據庫讀取。 這是異步完成的。 沒有延遲,線程可以繼續...但是如果沒有數據,該怎么辦?

  • A1回答“還不知道”?
  • A2是否有其他要求?

A1對我來說毫無意義。 我可以想象一個客戶端在此期間發出其他請求(例如在首次訪問站點時加載多個資源),但總的來說沒有。

A2當它獲取另一個請求時,它將失去整個上下文。 該上下文保存在promise中,當數據到達時,promise將被實現,但是處理該promise的線程是什么?

  • B1以后相同的線程
  • B2不同的線程。

在B1的情況下,您可能很幸運,並且某些相關數據可能仍在線程的緩存中,但是考慮到DB請求需要花費幾毫秒的時間,因此收益是恕我直言的低。

案例B2實際上不等於上下文切換嗎?

答:Node.js將不會響應任何請求,除非您編寫主動發送響應的代碼。 該代碼是同步運行還是異步運行都沒有關系。
客戶端(甚至服務器的網絡堆棧)無法知道或不在乎同步是否同時發生。

B:只有一個Node.js線程,一個周期。
當對Node.js代碼中啟動的異步操作的響應到達時,Node.js事件循環線程中將引發一個事件,並調用適當的回調/處理程序。

Node.js基於libuv C庫。

在內部使用線程來偽造所有系統調用的異步特性。 libuv還使用線程允許應用程序異步執行實際上正在阻塞的任務,方法是生成線程並在完成時收集結果。

線程開始處理請求,進行一點計算,然后發現需要從數據庫讀取。 這是異步完成的。 沒有延遲,線程可以繼續...但是如果沒有數據,該怎么辦?

將回調傳遞給數據庫模塊的方法,然后從當前作為事件偵聽器調用的函數中返回。 事件循環將繼續到隊列中的下一個事件。 在回調內部可以訪問上下文作為函數的閉包。

暫無
暫無

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

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