国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

javascript:多線程與偽線程

genefy / 2378人閱讀

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

web worker

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

偽線程

重點:
瀏覽器的內核是多線程的,一個瀏覽器一般至少實現三個常駐線程:javascript引擎線程,GUI渲染線程,瀏覽器事件觸發線程。

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

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

var thread = function () {
    var nowTime = 0, //線程已經執行了多久
        maxTime = 15;//線程最多執行多久
    var threadArr = [];//數組模擬線程隊列
    
    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 {//每執行完線程后睡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)
    })
}

循環百萬級的數據量并且不阻塞Ui線程是完全沒問題的,但過億瀏覽器還是會蹦。(這里只是提供個簡單的思路,其實過億也可以不蹦)

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/82052.html

相關文章

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

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

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

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

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

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

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

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

    godlong_X 評論0 收藏0

發表評論

0條評論

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