亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

javascript:多線程與偽線程

genefy / 2424人閱讀

摘要:偽線程重點瀏覽器的內(nèi)核是多線程的,一個瀏覽器一般至少實現(xiàn)三個常駐線程引擎線程,渲染線程,瀏覽器事件觸發(fā)線程。當我們要循環(huán)過百萬級的數(shù)據(jù)甚至億的時候怎么辦那就用模擬一個多線程。

web worker

這里就不多說了,主要說偽線程。因為web worker不能操作dom元素,很多時候用不上。

偽線程

重點:
瀏覽器的內(nèi)核是多線程的,一個瀏覽器一般至少實現(xiàn)三個常駐線程:javascript引擎線程,GUI渲染線程,瀏覽器事件觸發(fā)線程。

a.javascript引擎是基于事件驅(qū)動單線程執(zhí)行的,JS引擎一直等待著任務(wù)隊列中任務(wù)的到來,然后加以處理,瀏覽器無論什么時候都只有一個JS線程在運行JS程序。
b.GUI渲染線程負責渲染瀏覽器界面,當界面需要重排、重繪或由于某種操作引發(fā)回流時,該線程就會執(zhí)行。但需要注意 GUI渲染線程與JS引擎是互斥的,當JS引擎執(zhí)行時GUI線程會被掛起,GUI更新會被保存在一個隊列中等到JS引擎空閑時立即被執(zhí)行。
c.事件觸發(fā)線程,當一個事件被觸發(fā)時該線程會把事件添加到待處理隊列的隊尾,等待JS引擎的處理。這些事件可來自JavaScript引擎當前執(zhí)行的代碼塊如setTimeOut、也可來自瀏覽器內(nèi)核的其他線程如鼠標點擊、AJAX異步請求等,但由于JS的單線程關(guān)系所有這些事件都得排隊等待JS引擎處理。

當我們要循環(huán)過百萬級的數(shù)據(jù)甚至億的時候怎么辦?
那就用setTimeout模擬一個多線程。
重點:js的工作機制是:當線程中沒有執(zhí)行任何同步代碼的前提下才會執(zhí)行異步代碼,setTimeout是異步代碼,所以setTimeout只能等js空閑才會執(zhí)行,但死循環(huán)是永遠不會空閑的,所以setTimeout也永遠不會執(zhí)行。即使setTimeout為0,他也是等js引擎的代碼執(zhí)行完之后才會插入到j(luò)s引擎線程的最后執(zhí)行。
上栗子

var thread = function () {
    var nowTime = 0, //線程已經(jīng)執(zhí)行了多久
        maxTime = 15;//線程最多執(zhí)行多久
    var threadArr = [];//數(shù)組模擬線程隊列
    
    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 {//先睡著等待線程隊列
            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)百萬級的數(shù)據(jù)量并且不阻塞Ui線程是完全沒問題的,但過億瀏覽器還是會蹦。(這里只是提供個簡單的思路,其實過億也可以不蹦)

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/82052.html

相關(guān)文章

  • 瀏覽器的進程與線程詳解

    摘要:瀏覽器的渲染進程瀏覽器內(nèi)核,是多線程的,主要以下幾大類線程引擎線程事件觸發(fā)線程定時器線程網(wǎng)絡(luò)請求線程線程負責渲染瀏覽器界面元素當界面需要重繪或由于某種操作引發(fā)回流時該線程就會執(zhí)行。 進程 進程是cpu的資源分配的最小單位。 多進程:多進程指的是在同一個時間里,同一個計算機系統(tǒng)中如果允許兩個或兩個以上的進程處于運行狀態(tài)。多進程帶來的好處是明顯的,比如你可以聽歌的同時,打開編輯器敲代碼,編...

    wangxinarhat 評論0 收藏0
  • 瀏覽器的進程與線程詳解

    摘要:瀏覽器的渲染進程瀏覽器內(nèi)核,是多線程的,主要以下幾大類線程引擎線程事件觸發(fā)線程定時器線程網(wǎng)絡(luò)請求線程線程負責渲染瀏覽器界面元素當界面需要重繪或由于某種操作引發(fā)回流時該線程就會執(zhí)行。 進程 進程是cpu的資源分配的最小單位。 多進程:多進程指的是在同一個時間里,同一個計算機系統(tǒng)中如果允許兩個或兩個以上的進程處于運行狀態(tài)。多進程帶來的好處是明顯的,比如你可以聽歌的同時,打開編輯器敲代碼,編...

    zhjx922 評論0 收藏0
  • 瀏覽器的進程與線程詳解

    摘要:瀏覽器的渲染進程瀏覽器內(nèi)核,是多線程的,主要以下幾大類線程引擎線程事件觸發(fā)線程定時器線程網(wǎng)絡(luò)請求線程線程負責渲染瀏覽器界面元素當界面需要重繪或由于某種操作引發(fā)回流時該線程就會執(zhí)行。 進程 進程是cpu的資源分配的最小單位。 多進程:多進程指的是在同一個時間里,同一個計算機系統(tǒng)中如果允許兩個或兩個以上的進程處于運行狀態(tài)。多進程帶來的好處是明顯的,比如你可以聽歌的同時,打開編輯器敲代碼,編...

    darryrzhong 評論0 收藏0
  • JavaScript線程機制與事件機制

    摘要:的單線程,與它的用途有關(guān)。為了利用多核的計算能力,提出標準,允許腳本創(chuàng)建多個線程,但是子線程完全受主線程控制,且不得操作。 showImg(https://segmentfault.com/img/remote/1460000016649971?w=1481&h=876); 一、進程與線程 1.進程 進程是指程序的一次執(zhí)行,它占有一片獨有的內(nèi)存空間,可以通過windows任務(wù)管理器查看...

    godlong_X 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<