首頁 | 資訊 | 財經 | 公益 | 彩店 | 奇聞 | 速遞 | 前瞻 | 提點 | 網站相關 | 科技 | 熱點 | 生活 |
      JS中的進程和線程_熱點在線

      發稿時間:2023-04-21 15:23:18 來源: 博客園

      進程和線程都是計算機中的概念,用于描述程序執行時的運行單位。

      進程是指正在運行的程序的實例,包括程序代碼、數據、堆棧和資源等。 每個進程都擁有獨立的地址空間,因此不同進程之間的數據無法直接訪問,只能通過進程間通信的方式進行交互。


      (資料圖)

      線程是進程中的一個執行單元,一個進程可以包含多個線程,每個線程共享進程的地址空間和資源,但是擁有自己的堆棧和執行狀態。 不同線程之間可以直接訪問同一進程的數據,因此線程間通信更加方便,但也需要注意線程同步和互斥問題。

      在 JavaScript 中,進程和線程的概念并不是直接暴露給開發者的,而是通過瀏覽器或 Node.js 等執行環境來實現的。

      在瀏覽器中,JavaScript 是單線程的,也就是說所有 JavaScript 代碼都運行在同一個線程中,這個線程被稱為“UI 線程”或“主線程”。 這個線程負責處理用戶交互事件、更新 UI 界面、執行 js 代碼等任務。如果 js 代碼執行時間過長,會導致頁面出現“假死”或“卡頓”現象,因此需要采用異步編程的方式來避免這種情況。

      在 JavaScript 中,常用的異步編程方式有回調函數、 Promise 和 async/await 等。這些方式都可以讓 js 代碼異步執行,從而避免長時間阻塞 UI 線程。

      在 Node.js 中,JavaScript 采用的是基于事件驅動和非阻塞 I/O 的模型,也就是說,它是基于單線程的,但是可以通過異步 I/O 和事件驅動來實現高并發。在 Node.js 中,可以通過 child_process 或 cluster 模塊來創建子進程,實現多進程的方式來提高程序的并發性能。

      下面是在 JavaScript 中使用異步編程方式避免阻塞 UI 線程的例子:

      // 使用回調函數的方式異步加載圖片function loadImageAsync(url, callback) {  var img = new Image();  img.onload = function() {    callback(null, img);  };  img.onerror = function() {    callback(new Error("Could not load image at " + url));  };  img.src = url;}// 調用異步函數加載圖片并更新 UIloadImageAsync("https://image.com/image.png", function(err, img) {  if (err) {    console.error(err);  } else {    document.body.appendChild(img);  }});

      上面的代碼通過回調函數的方式實現了異步加載圖片,避免了長時間阻塞 UI 線程。

      下面是在 Node.js 中用 child_process 模塊創建子進程的例子:

      const { spawn } = require("child_process");// 創建子進程并執行命令const child = spawn("ls", ["-lh", "/usr"]);// 監聽子進程的輸出child.stdout.on("data", (data) => {  console.log( child stdout:\n${data} );});child.stderr.on("data", (data) => {  console.error( child stderr:\n${data} );});// 監聽子進程的關閉事件child.on("close", (code) => {  console.log( child process exited with code ${code} );});

      在上面的示例中,我們創建了一個子進程,并在其中執行 ls -lh /usr 命令。我們還監聽子進程的輸出和關閉事件。在執行期間,子進程的輸出將被打印到控制臺,并在子進程退出時輸出子進程的退出代碼。

      注意,這里我們使用的是 Node.js 的 spawn 方法,它是異步的。還有一個 exec 方法可以執行同步的系統命令,但是在執行長時間運行的任務時可能會阻塞主進程的執行。

      總的來說,JavaScript 中的進程和線程概念都是通過執行環境來實現的,而不是直接暴露給開發者的。開發者需要根據實際需求來選擇合適的編程模型,以達到最優的性能和并發效果。同時,我們還需要注意異步編程的相關技術和并發控制的問題,以確保程序的正確性和性能。

      標簽:

      責任編輯:mb01

      網站首頁 | 關于我們 | 免責聲明 | 聯系我們

      生活晚報網版權所有

      Copyright @ 1999-2017 www.8x5.com.cn All Rights Reserved豫ICP備20022870號-23

      聯系郵箱:553 138 779@qq.com