進程和線程都是計算機中的概念,用于描述程序執(zhí)行時的運行單位。
進程是指正在運行的程序的實例,包括程序代碼、數(shù)據(jù)、堆棧和資源等。 每個進程都擁有獨立的地址空間,因此不同進程之間的數(shù)據(jù)無法直接訪問,只能通過進程間通信的方式進行交互。
(資料圖)
線程是進程中的一個執(zhí)行單元,一個進程可以包含多個線程,每個線程共享進程的地址空間和資源,但是擁有自己的堆棧和執(zhí)行狀態(tài)。 不同線程之間可以直接訪問同一進程的數(shù)據(jù),因此線程間通信更加方便,但也需要注意線程同步和互斥問題。
在 JavaScript 中,進程和線程的概念并不是直接暴露給開發(fā)者的,而是通過瀏覽器或 Node.js 等執(zhí)行環(huán)境來實現(xiàn)的。
在瀏覽器中,JavaScript 是單線程的,也就是說所有 JavaScript 代碼都運行在同一個線程中,這個線程被稱為“UI 線程”或“主線程”。 這個線程負責處理用戶交互事件、更新 UI 界面、執(zhí)行 js 代碼等任務(wù)。如果 js 代碼執(zhí)行時間過長,會導致頁面出現(xiàn)“假死”或“卡頓”現(xiàn)象,因此需要采用異步編程的方式來避免這種情況。
在 JavaScript 中,常用的異步編程方式有回調(diào)函數(shù)、 Promise 和 async/await 等。這些方式都可以讓 js 代碼異步執(zhí)行,從而避免長時間阻塞 UI 線程。
在 Node.js 中,JavaScript 采用的是基于事件驅(qū)動和非阻塞 I/O 的模型,也就是說,它是基于單線程的,但是可以通過異步 I/O 和事件驅(qū)動來實現(xiàn)高并發(fā)。在 Node.js 中,可以通過 child_process 或 cluster 模塊來創(chuàng)建子進程,實現(xiàn)多進程的方式來提高程序的并發(fā)性能。
下面是在 JavaScript 中使用異步編程方式避免阻塞 UI 線程的例子:
// 使用回調(diào)函數(shù)的方式異步加載圖片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;}// 調(diào)用異步函數(shù)加載圖片并更新 UIloadImageAsync("https://image.com/image.png", function(err, img) { if (err) { console.error(err); } else { document.body.appendChild(img); }});上面的代碼通過回調(diào)函數(shù)的方式實現(xiàn)了異步加載圖片,避免了長時間阻塞 UI 線程。
下面是在 Node.js 中用 child_process 模塊創(chuàng)建子進程的例子:
const { spawn } = require("child_process");// 創(chuàng)建子進程并執(zhí)行命令const child = spawn("ls", ["-lh", "/usr"]);// 監(jiān)聽子進程的輸出child.stdout.on("data", (data) => { console.log( child stdout:\n${data} );});child.stderr.on("data", (data) => { console.error( child stderr:\n${data} );});// 監(jiān)聽子進程的關(guān)閉事件child.on("close", (code) => { console.log( child process exited with code ${code} );});在上面的示例中,我們創(chuàng)建了一個子進程,并在其中執(zhí)行 ls -lh /usr 命令。我們還監(jiān)聽子進程的輸出和關(guān)閉事件。在執(zhí)行期間,子進程的輸出將被打印到控制臺,并在子進程退出時輸出子進程的退出代碼。
注意,這里我們使用的是 Node.js 的 spawn 方法,它是異步的。還有一個 exec 方法可以執(zhí)行同步的系統(tǒng)命令,但是在執(zhí)行長時間運行的任務(wù)時可能會阻塞主進程的執(zhí)行。
總的來說,JavaScript 中的進程和線程概念都是通過執(zhí)行環(huán)境來實現(xiàn)的,而不是直接暴露給開發(fā)者的。開發(fā)者需要根據(jù)實際需求來選擇合適的編程模型,以達到最優(yōu)的性能和并發(fā)效果。同時,我們還需要注意異步編程的相關(guān)技術(shù)和并發(fā)控制的問題,以確保程序的正確性和性能。
標簽:
- 淮劇《小白楊》深情上演 致敬一代代援疆人的“精神豐碑”
- 寧德時代出資20億元在洛陽成立新公司 經(jīng)營范圍含電池制造等業(yè)務(wù)_即時焦點
- 小法:我尊重圖多爾但他不尊重我,溫格觀戰(zhàn)是我給他買的票_今日快看
- 農(nóng)發(fā)行湖南省分行違反金融統(tǒng)計規(guī)定被警告并罰款135.4萬元 速讀
- 黃曉明回應為新戲增肥30斤:這是我人生中最快樂的時光 觀速訊
- 每日動態(tài)!國家統(tǒng)計局:9月份社會消費品零售總額增長3.0%
- 中國之變|這五年,數(shù)字化點亮新生活-每日觀點
- 大行評級丨里昂:上調(diào)臺積電目標價至2000新臺幣 維持“高度確信跑贏大市”評級_每日時訊
- 熱消息:內(nèi)蒙古赤峰農(nóng)村牧區(qū)產(chǎn)權(quán)流轉(zhuǎn)服務(wù)中心完成首單交易
- 熱資訊!贛C支持湘C!宜春“老表”跨城應援
- 丹尼-格林:姚明如不傷難以想象,文班或能成為他本該成為的人
- 房產(chǎn)投資的風險與收益權(quán)衡?
- 鼎佳精密:10月17日獲融資買入291.41萬元_快資訊
- 財報速遞:達瑞電子2025年前三季度凈利潤2.31億元 每日動態(tài)
- 廣州湛建建材有限公司成立 注冊資本10萬人民幣|焦點快播
- 今日熱搜:時空科技擬“跨界”收購 切入半導體存儲賽道
- 當前聚焦:佑駕創(chuàng)新中標1185萬元車路云一體化城市交通融合感知項目
- 中原證券擬實施2025年半年度權(quán)益分派,共計派發(fā)現(xiàn)金紅利3714.31萬元-當前熱議
- 每日視點!主場戰(zhàn)三鎮(zhèn)賽前,大連英博為隊史首位外援羅伯森舉辦退役儀式
- 祥生醫(yī)療前三季度營業(yè)收入3.43億元,同比下降5.27%
- 江蘇最低工資標準公布
- 首佳科技于10月17日耗資56萬港元回購70萬股-每日消息
- 靳東:延安的變化讓人刮目相看_焦點簡訊
- 當前關(guān)注:凡人微光|這座城的精神,正年輕!
- 又見中小銀行密集調(diào)降存款利率-簡訊
- 前沿熱點:思源電氣前三季度凈利21.91億元,同比增長46.94%
- 今日快看!劉浩存談藝術(shù)的生命力
- 要聞:呂瑞浩公參會見上海市疾控局團組
- 光庭信息:2025年前三季度凈利潤4477.54萬元 同比增長308.53%_最新資訊
- 拿起手機就能免費聽講座、看展覽 “十四五”期間多彩文化點亮生活





