成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

什么是 Event Loop?

開發(fā) 前端
Event Loop 是一個(gè)很重要的概念,指的是計(jì)算機(jī)系統(tǒng)的一種運(yùn)行機(jī)制。JavaScript語言就采用這種機(jī)制,來解決單線程運(yùn)行帶來的一些問題。

Event Loop 是一個(gè)很重要的概念,指的是計(jì)算機(jī)系統(tǒng)的一種運(yùn)行機(jī)制。

JavaScript語言就采用這種機(jī)制,來解決單線程運(yùn)行帶來的一些問題。

120131024105854

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

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

如果有很多任務(wù)需要執(zhí)行,不外乎三種解決方法。

(1)排隊(duì)。因?yàn)橐粋€(gè)進(jìn)程一次只能執(zhí)行一個(gè)任務(wù),只好等前面的任務(wù)執(zhí)行完了,再執(zhí)行后面的任務(wù)。

(2)新建進(jìn)程。使用fork命令,為每個(gè)任務(wù)新建一個(gè)進(jìn)程。

(3)新建線程。因?yàn)檫M(jìn)程太耗費(fèi)資源,所以如今的程序往往允許一個(gè)進(jìn)程包含多個(gè)線程,由線程去完成任務(wù)。(進(jìn)程和線程的詳細(xì)解釋,請(qǐng)看這里。)

以JavaScript語言為例,它是一種單線程語言,所有任務(wù)都在一個(gè)線程上完成,即采用上面的***種方法。一旦遇到大量任務(wù)或者遇到一個(gè)耗時(shí)的任務(wù),網(wǎng)頁就會(huì)出現(xiàn)”假死”,因?yàn)镴avaScript停不下來,也就無法響應(yīng)用戶的行為。

你也許會(huì)問,JavaScript為什么是單線程,難道不能實(shí)現(xiàn)為多線程嗎?

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

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

220131024105922

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

如果采用多線程,同時(shí)運(yùn)行多個(gè)任務(wù),那很可能就是下面這樣。

320131024105935

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

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

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

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

420131024105954

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

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

這正是JavaScript語言的運(yùn)行方式。單線程模型雖然對(duì)JavaScript構(gòu)成了很大的限制,但也因此使它具備了其他語言不具備的優(yōu)勢(shì)。如 果部署得好,JavaScript程序是不會(huì)出現(xiàn)堵塞的,這就是為什么node.js平臺(tái)可以用很少的資源,應(yīng)付大流量訪問的原因。

原文鏈接:http://www.ruanyifeng.com/blog/2013/10/event_loop.html

責(zé)任編輯:陳四芳 來源: ruanyifeng.com
相關(guān)推薦

2022-06-29 08:37:03

事件循環(huán)JS 語言

2019-10-11 09:00:00

JavaScriptEvent Loop前端

2021-04-27 08:31:06

event loopJavaScriptsetTimeout函

2023-04-28 15:20:37

JavaScript事件循環(huán)

2022-08-29 18:15:25

Node.js多線程模型

2022-10-17 13:35:23

EventJS工具

2017-09-14 13:48:20

Vue.js機(jī)制應(yīng)用

2020-09-28 14:41:24

Event Loop

2017-09-12 09:50:08

JavaScriptEvent LoopVue.js

2022-05-04 10:22:39

Nodejs異步模式

2021-03-20 22:46:22

IaaSSaaSPaaS

2023-09-01 13:49:00

內(nèi)存進(jìn)程線程

2020-07-14 14:59:00

控制反轉(zhuǎn)依賴注入容器

2017-12-19 21:29:58

物聯(lián)網(wǎng)區(qū)塊鏈大數(shù)據(jù)

2011-07-04 14:50:49

QT Event 事件

2020-11-20 10:51:03

云計(jì)算

2025-05-26 02:55:00

value安全開發(fā)

2018-01-30 11:17:56

集群分布式SOA?

2023-09-14 15:00:31

2009-07-16 09:56:32

什么是iBATIS
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 中文字幕在线第二页 | 欧美老妇交乱视频 | 欧美电影免费观看 | 国产精品一区在线观看 | 一级a性色生活片久久毛片 午夜精品在线观看 | 欧美精品一区二区三区四区五区 | av网站免费在线观看 | 北条麻妃99精品青青久久主播 | 久久久久久久91 | 亚洲视频免费在线播放 | 国产三级国产精品 | 亚洲天堂免费在线 | 嫩草视频免费 | 日本精a在线观看 | 99久久精品一区二区毛片吞精 | av天天干| 日韩播放| 亚洲一卡二卡 | 伊人狼人影院 | 亚洲午夜视频 | 成人精品在线观看 | 国产黄色小视频在线观看 | 一级全黄视频 | 成人自拍视频网站 | 成年人的视频免费观看 | 色婷婷综合在线观看 | 免费黄色的视频 | 一二三四在线视频观看社区 | 色www精品视频在线观看 | 99久久电影| 最近免费日本视频在线 | 国产亚洲网站 | av天天看| 欧美久久一区二区三区 | 国产一区日韩在线 | 影音先锋中文字幕在线观看 | 欧美一级二级视频 | 精品香蕉一区二区三区 | 久久久91精品国产一区二区三区 | 精品国产第一区二区三区 | 国产精品jizz在线观看老狼 |