首頁 >web前端 >js教程 >如何正確實作Node.js的非阻塞功能?

如何正確實作Node.js的非阻塞功能?

Patricia Arquette
Patricia Arquette原創
2024-12-09 10:10:09341瀏覽

How Can I Correctly Implement Non-Blocking Functions in Node.js?

Node.js 中非阻塞函數的正確實作

儘管存在誤解,但僅僅將程式碼包裝在Promise 中並不會使其成為非阻塞-阻塞。 Promise 執行器函數本質上是同步的,會阻止執行。這是在列印後續行之前在提供的程式碼中觀察到延遲的原因。

提供的程式碼的問題

程式碼最初看起來是非阻塞的,利用 Promise 回傳計算密集 longRunningFunc 的結果。然而,在執行時,我們觀察到在列印第二行和第三行之前有延遲,這表明程式正在等待 Promise 解析。

Node.js 中真正的非阻塞程式碼

為了在Node.js 中建立真正的非阻塞程式碼,我們有幾個選項:

  • 子進程:在單獨的子進程中執行程式碼,完成後接收非同步通知。
  • 工作執行緒(Node.js) Node.js v11 ): 利用Node.js 中引入的實驗性工作執行緒v11.
  • 原生程式碼插件:利用libuv 或作業系統級執行緒開發自訂原生插件。
  • 利用現有非同步API: 基於現有的非同步API 構建,避免在主程式中長時間執行程式碼

修改範例

雖然將程式碼包裝在Promise 中不足以實現非阻塞行為,但我們可以使用setTimeout() 來調度for 迴圈以便稍後執行:

function longRunningFunc(val, mod) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      let sum = 0;
      for (let i = 0; i < 100000; i++) {
        for (let j = 0; j < val; j++) {
          sum += i + j % mod;
        }
      }
      resolve(sum);
    }, 10);
  });
}

這種方法改變了 for 迴圈的時間,給出非阻塞行為的出現。然而,需要注意的是,for 迴圈一旦被調度仍然會同步執行。為了實現真正的非阻塞程式碼,我們需要採用前面描述的技術之一。

以上是如何正確實作Node.js的非阻塞功能?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn