摘要:偽線程重點(diǎn)瀏覽器的內(nèi)核是多線程的,一個(gè)瀏覽器一般至少實(shí)現(xiàn)三個(gè)常駐線程引擎線程,渲染線程,瀏覽器事件觸發(fā)線程。當(dāng)我們要循環(huán)過(guò)百萬(wàn)級(jí)的數(shù)據(jù)甚至億的時(shí)候怎么辦那就用模擬一個(gè)多線程。
web worker
這里就不多說(shuō)了,主要說(shuō)偽線程。因?yàn)閣eb worker不能操作dom元素,很多時(shí)候用不上。
偽線程重點(diǎn):
瀏覽器的內(nèi)核是多線程的,一個(gè)瀏覽器一般至少實(shí)現(xiàn)三個(gè)常駐線程:javascript引擎線程,GUI渲染線程,瀏覽器事件觸發(fā)線程。
a.javascript引擎是基于事件驅(qū)動(dòng)單線程執(zhí)行的,JS引擎一直等待著任務(wù)隊(duì)列中任務(wù)的到來(lái),然后加以處理,瀏覽器無(wú)論什么時(shí)候都只有一個(gè)JS線程在運(yùn)行JS程序。
b.GUI渲染線程負(fù)責(zé)渲染瀏覽器界面,當(dāng)界面需要重排、重繪或由于某種操作引發(fā)回流時(shí),該線程就會(huì)執(zhí)行。但需要注意 GUI渲染線程與JS引擎是互斥的,當(dāng)JS引擎執(zhí)行時(shí)GUI線程會(huì)被掛起,GUI更新會(huì)被保存在一個(gè)隊(duì)列中等到JS引擎空閑時(shí)立即被執(zhí)行。
c.事件觸發(fā)線程,當(dāng)一個(gè)事件被觸發(fā)時(shí)該線程會(huì)把事件添加到待處理隊(duì)列的隊(duì)尾,等待JS引擎的處理。這些事件可來(lái)自JavaScript引擎當(dāng)前執(zhí)行的代碼塊如setTimeOut、也可來(lái)自瀏覽器內(nèi)核的其他線程如鼠標(biāo)點(diǎn)擊、AJAX異步請(qǐng)求等,但由于JS的單線程關(guān)系所有這些事件都得排隊(duì)等待JS引擎處理。
當(dāng)我們要循環(huán)過(guò)百萬(wàn)級(jí)的數(shù)據(jù)甚至億的時(shí)候怎么辦?
那就用setTimeout模擬一個(gè)多線程。
重點(diǎn):js的工作機(jī)制是:當(dāng)線程中沒(méi)有執(zhí)行任何同步代碼的前提下才會(huì)執(zhí)行異步代碼,setTimeout是異步代碼,所以setTimeout只能等js空閑才會(huì)執(zhí)行,但死循環(huán)是永遠(yuǎn)不會(huì)空閑的,所以setTimeout也永遠(yuǎn)不會(huì)執(zhí)行。即使setTimeout為0,他也是等js引擎的代碼執(zhí)行完之后才會(huì)插入到j(luò)s引擎線程的最后執(zhí)行。
上栗子
var thread = function () { var nowTime = 0, //線程已經(jīng)執(zhí)行了多久 maxTime = 15;//線程最多執(zhí)行多久 var threadArr = [];//數(shù)組模擬線程隊(duì)列 this.addThread = function (fn) { threadArr.push(fn) } this.start=function () { doingThread(); } var doingThread = function () { if (threadArr.length > 0) { if (nowTime < maxTime) { let now = new Date().getTime(); var method = threadArr[0]; method(); threadArr.splice(0, 1); let nowNew = (new Date().getTime() - now); nowTime += nowNew; doingThread(); } else {//每執(zhí)行完線程后睡1ms nowTime=0; setTimeout(doingThread, 1); } }else {//先睡著等待線程隊(duì)列 setTimeout(doingThread,100) } } } var fn = function (num) { console.log(num) } var thread = new thread(); thread.start() for (let i = 0; i < 1000000; i++) { thread.addThread(function () { fn(i) }) }
循環(huán)百萬(wàn)級(jí)的數(shù)據(jù)量并且不阻塞Ui線程是完全沒(méi)問(wèn)題的,但過(guò)億瀏覽器還是會(huì)蹦。(這里只是提供個(gè)簡(jiǎn)單的思路,其實(shí)過(guò)億也可以不蹦)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/82052.html
摘要:瀏覽器的渲染進(jìn)程瀏覽器內(nèi)核,是多線程的,主要以下幾大類線程引擎線程事件觸發(fā)線程定時(shí)器線程網(wǎng)絡(luò)請(qǐng)求線程線程負(fù)責(zé)渲染瀏覽器界面元素當(dāng)界面需要重繪或由于某種操作引發(fā)回流時(shí)該線程就會(huì)執(zhí)行。 進(jìn)程 進(jìn)程是cpu的資源分配的最小單位。 多進(jìn)程:多進(jìn)程指的是在同一個(gè)時(shí)間里,同一個(gè)計(jì)算機(jī)系統(tǒng)中如果允許兩個(gè)或兩個(gè)以上的進(jìn)程處于運(yùn)行狀態(tài)。多進(jìn)程帶來(lái)的好處是明顯的,比如你可以聽(tīng)歌的同時(shí),打開(kāi)編輯器敲代碼,編...
摘要:瀏覽器的渲染進(jìn)程瀏覽器內(nèi)核,是多線程的,主要以下幾大類線程引擎線程事件觸發(fā)線程定時(shí)器線程網(wǎng)絡(luò)請(qǐng)求線程線程負(fù)責(zé)渲染瀏覽器界面元素當(dāng)界面需要重繪或由于某種操作引發(fā)回流時(shí)該線程就會(huì)執(zhí)行。 進(jìn)程 進(jìn)程是cpu的資源分配的最小單位。 多進(jìn)程:多進(jìn)程指的是在同一個(gè)時(shí)間里,同一個(gè)計(jì)算機(jī)系統(tǒng)中如果允許兩個(gè)或兩個(gè)以上的進(jìn)程處于運(yùn)行狀態(tài)。多進(jìn)程帶來(lái)的好處是明顯的,比如你可以聽(tīng)歌的同時(shí),打開(kāi)編輯器敲代碼,編...
摘要:瀏覽器的渲染進(jìn)程瀏覽器內(nèi)核,是多線程的,主要以下幾大類線程引擎線程事件觸發(fā)線程定時(shí)器線程網(wǎng)絡(luò)請(qǐng)求線程線程負(fù)責(zé)渲染瀏覽器界面元素當(dāng)界面需要重繪或由于某種操作引發(fā)回流時(shí)該線程就會(huì)執(zhí)行。 進(jìn)程 進(jìn)程是cpu的資源分配的最小單位。 多進(jìn)程:多進(jìn)程指的是在同一個(gè)時(shí)間里,同一個(gè)計(jì)算機(jī)系統(tǒng)中如果允許兩個(gè)或兩個(gè)以上的進(jìn)程處于運(yùn)行狀態(tài)。多進(jìn)程帶來(lái)的好處是明顯的,比如你可以聽(tīng)歌的同時(shí),打開(kāi)編輯器敲代碼,編...
摘要:的單線程,與它的用途有關(guān)。為了利用多核的計(jì)算能力,提出標(biāo)準(zhǔn),允許腳本創(chuàng)建多個(gè)線程,但是子線程完全受主線程控制,且不得操作。 showImg(https://segmentfault.com/img/remote/1460000016649971?w=1481&h=876); 一、進(jìn)程與線程 1.進(jìn)程 進(jìn)程是指程序的一次執(zhí)行,它占有一片獨(dú)有的內(nèi)存空間,可以通過(guò)windows任務(wù)管理器查看...
閱讀 2959·2021-11-25 09:43
閱讀 3336·2021-11-24 09:39
閱讀 2844·2021-09-22 15:59
閱讀 2215·2021-09-13 10:24
閱讀 520·2019-08-29 17:02
閱讀 2111·2019-08-29 13:23
閱讀 3071·2019-08-29 13:06
閱讀 3550·2019-08-29 13:04