成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

javascript:多線程與偽線程

genefy / 2381人閱讀

摘要:偽線程重點(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

相關(guān)文章

  • 瀏覽器的進(jìn)程與線程詳解

    摘要:瀏覽器的渲染進(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)編輯器敲代碼,編...

    wangxinarhat 評(píng)論0 收藏0
  • 瀏覽器的進(jìn)程與線程詳解

    摘要:瀏覽器的渲染進(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)編輯器敲代碼,編...

    zhjx922 評(píng)論0 收藏0
  • 瀏覽器的進(jìn)程與線程詳解

    摘要:瀏覽器的渲染進(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)編輯器敲代碼,編...

    darryrzhong 評(píng)論0 收藏0
  • JavaScript線程機(jī)制與事件機(jī)制

    摘要:的單線程,與它的用途有關(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ù)管理器查看...

    godlong_X 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<