JavaScript執行機制詳解:再談Evemt

weixin_33895657發表於2018-08-22

1.why 單執行緒?

  • JavaScript目的是與使用者互動+操作DOM,非單執行緒帶來複雜同步問題;EXAMPLE:有兩個執行緒 一個在DOM節點上新增內容,另外一個又在刪除這個點。瀏覽器聽誰的?
  • 新標準 HTML5提出web worker標準,允許JavaScript建立多執行緒,但是子執行緒完全受主執行緒控制,且不得操作DOM。沒有改變其本質。
  • 弊端 單執行緒執行那後面的排著等你。

2. 任務佇列

很多時候IO(烏龜)限制CPU(兔子)的發揮。
所以把IO裡面的任務?

將任務分成同步與非同步。

  • 同步:主執行緒上排隊進行的任務。按序執行。
  • 非同步:不進入主執行緒、而進入任務佇列的任務。只有去通知主執行緒某個非同步任務可執行了,該任務才會進入主執行緒執行。
  • 同步執行
7078482-47a38fec33a14524.png
image.png
  • 非同步執行
    7078482-2d4ebf5e13a0aca3.png
    image.png

    上圖主執行緒的綠色部分,還是表示執行時間,而橙色部分表示空閒時間。每當遇到I/O的時候,主執行緒就讓Event Loop執行緒去通知相應的I/O程式,然後接著往後執行,所以不存在紅色的等待時間。等到I/O程式完成操作,Event Loop執行緒再把結果返回主執行緒。主執行緒就呼叫事先設定的回撥函式,完成整個任務。
    可以看到,由於多出了橙色的空閒時間,所以主執行緒得以執行更多的任務,這就提高了效率。這種執行方式稱為”非同步模式“(asynchronous I/O)。

相關文章