JS的單線程與異步
阿新 • • 發佈:2019-03-06
響應 至少 不同的 網絡 選擇 定時器 假死 主線程 運行
大家都知道js是單線程的,但可以進行異步請求,這不是相互矛盾嗎?
js選擇了成為單線程的語言,所以它本身不可能是異步的,但js的宿主環境(比如瀏覽器,Node)是多線程的,宿主環境通過某種方式(事件驅動)使得js具備了異步的屬性。
js是單線程語言,瀏覽器只分配給js一個主線程,用來執行任務(函數),但一次只能執行一個任務,這些任務形成一個任務隊列排隊等候執行,但前端的某些任務是非常耗時的,比如網絡請求,定時器和事件監聽,如果讓他們和別的任務一樣,都老老實實的排隊等待執行的話,執行效率會非常的低,甚至導致頁面的假死。所以,瀏覽器為這些耗時任務開辟了另外的線程,主要包括http請求線程,瀏覽器定時觸發器,瀏覽器事件觸發線程,這些任務是異步的。
JavaScript引擎用單線程運行也是有意義的,單線程不必理會線程同步這些復雜的問題,問題得到簡化(如:可以避免多線程中一個增加dom,一個刪除dom,瀏覽器不知道聽誰的問題).
那麽單線程的JavaScript引擎是怎麽配合瀏覽器內核處理這些定時器和響應瀏覽器事件的呢?
下面結合瀏覽器內核處理方式簡單說明.
瀏覽器內核實現允許多個線程異步執行,這些線程在內核制控下相互配合以保持同步.假如某一瀏覽器內核的實現至少有三個常駐線 程:javascript引擎線程,界面渲染線程,瀏覽器事件觸發線程,除些以外,也有一些執行完就終止的線程,如Http請求線程,這些異步線程都會產 生不同的異步事件,雖然每個瀏覽器內核實現細節不同,但這其中的調用原理都是大同小異.
JS的單線程與異步