中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

什么是Event Loop

發布時間:2021-11-17 15:14:07 來源:億速云 閱讀:150 作者:柒染 欄目:web開發

什么是Event Loop,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

Event Loop 是一個很重要的概念,指的是計算機系統的一種運行機制。

JavaScript語言就采用這種機制,來解決單線程運行帶來的一些問題。

什么是Event Loop

本文參考C. Aaron Cois的《Understanding The Node.js Event Loop》,解釋什么是Event Loop,以及它與JavaScript語言的單線程模型有何關系。

想要理解Event Loop,就要從程序的運行模式講起。運行以后的程序叫做“進程”(process),一般情況下,一個進程一次只能執行一個任務。

如果有很多任務需要執行,不外乎三種解決方法。

(1)排隊。因為一個進程一次只能執行一個任務,只好等前面的任務執行完了,再執行后面的任務。

(2)新建進程。使用fork命令,為每個任務新建一個進程。

(3)新建線程。因為進程太耗費資源,所以如今的程序往往允許一個進程包含多個線程,由線程去完成任務。(進程和線程的詳細解釋,請看這里。)

以JavaScript語言為例,它是一種單線程語言,所有任務都在一個線程上完成,即采用上面的***種方法。一旦遇到大量任務或者遇到一個耗時的任務,網頁就會出現”假死”,因為JavaScript停不下來,也就無法響應用戶的行為。

你也許會問,JavaScript為什么是單線程,難道不能實現為多線程嗎?

這跟歷史有關系。JavaScript從誕生起就是單線程。原因大概是不想讓瀏覽器變得太復雜,因為多線程需要共享資源、且有可能修改彼此的運行結 果,對于一種網頁腳本語言來說,這就太復雜了。后來就約定俗成,JavaScript為一種單線程語言。(Worker  API可以實現多線程,但是JavaScript本身始終是單線程的。)

如果某個任務很耗時,比如涉及很多I/O(輸入/輸出)操作,那么線程的運行大概是下面的樣子。

什么是Event Loop

上圖的綠色部分是程序的運行時間,紅色部分是等待時間。可以看到,由于I/O操作很慢,所以這個線程的大部分運行時間都在空等I/O操作的返回結果。這種運行方式稱為”同步模式”(synchronous I/O)或”堵塞模式”(blocking I/O)。

如果采用多線程,同時運行多個任務,那很可能就是下面這樣。

什么是Event Loop

上圖表明,多線程不僅占用多倍的系統資源,也閑置多倍的資源,這顯然不合理。

Event Loop就是為了解決這個問題而提出的。Wikipedia這樣定義:

“Event Loop是一個程序結構,用于等待和發送消息和事件。(a programming construct that waits for and dispatches events or messages in a program.)”

簡單說,就是在程序中設置兩個線程:一個負責程序本身的運行,稱為”主線程”;另一個負責主線程與其他進程(主要是各種I/O操作)的通信,被稱為”Event Loop線程”(可以譯為”消息線程”)。

什么是Event Loop

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

可以看到,由于多出了橙色的空閑時間,所以主線程得以運行更多的任務,這就提高了效率。這種運行方式稱為”異步模式“(asynchronous I/O)或”非堵塞模式”(non-blocking mode)。

這正是JavaScript語言的運行方式。單線程模型雖然對JavaScript構成了很大的限制,但也因此使它具備了其他語言不具備的優勢。如 果部署得好,JavaScript程序是不會出現堵塞的,這就是為什么node.js平臺可以用很少的資源,應付大流量訪問的原因。

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

廊坊市| 新蔡县| 正定县| 深圳市| 井研县| 高唐县| 海原县| 桓台县| 西贡区| 马山县| 峨边| 翁牛特旗| 红河县| 襄汾县| 武夷山市| 清新县| 革吉县| 和林格尔县| 临泉县| 龙川县| 嘉鱼县| 信宜市| 文山县| 崇州市| 三亚市| 公安县| 政和县| 镶黄旗| 平安县| 新津县| 股票| 家居| 保靖县| 定州市| 罗甸县| 密山市| 蓝田县| 藁城市| 合肥市| 定安县| 和政县|