事件迴圈(Event Loop)淺析

still6發表於2018-03-27

一、JavaScript是單執行緒語言

為什麼JavaScript是單執行緒語言?作為瀏覽器指令碼語言,JavaScript的主要用途是與使用者互動,以及操作DOM。這決定了它只能是單執行緒,否則會帶來很複雜的同步問題。

比如涉及很多I/O(輸入/輸出)操作,那麼執行緒的執行大概是下面的樣子。

事件迴圈(Event Loop)淺析
該圖的綠色部分是程式的執行時間,紅色部分是等待時間。可以看到,由於I/O操作很慢,所以這個執行緒的大部分執行時間都在空等I/O操作的返回結果。這種執行方式稱為"同步模式"(synchronous I/O)或"堵塞模式"(blocking I/O)。

而如果採用多執行緒,同時執行多個任務,那很可能就是下面這樣。

事件迴圈(Event Loop)淺析
上圖表明,多執行緒不僅佔用多倍的系統資源,也閒置多倍的資源,這顯然不合理。

Event Loop就是為了解決這個問題而提出的。

二、Event Loop

Event Loop意為事件迴圈。是一種執行機制。主執行緒從"任務佇列"中讀取事件,這個過程是迴圈不斷的。

簡單說,就是在程式中設定兩個執行緒:一個負責程式本身的執行,稱為"主執行緒";另一個負責主執行緒與其他程式(主要是各種I/O操作)的通訊,被稱為"Event Loop執行緒"(可以譯為"訊息執行緒")。

事件迴圈(Event Loop)淺析

上圖主執行緒的綠色部分,還是表示執行時間,而橙色部分表示空閒時間。每當遇到I/O的時候,主執行緒就讓Event Loop執行緒去通知相應的I/O程式,然後接著往後執行,所以不存在紅色的等待時間。等到I/O程式完成操作,Event Loop執行緒再把結果返回主執行緒。主執行緒就呼叫事先設定的回撥函式,完成整個任務。

可以看到,由於多出了橙色的空閒時間,所以主執行緒得以執行更多的任務,這就提高了效率。這種執行方式稱為"非同步模式"(asynchronous I/O)或"非堵塞模式"(non-blocking mode)。

三、總結

當然瀏覽器環境的Event Loop和Node.js的事件迴圈機制是不一樣的。 瀏覽器環境下的Event Loop會解決單執行緒執行帶來的一些問題。

相關文章