您好,登錄后才能下訂單哦!
這篇文章主要講解了“JavaScript中事件循環(huán)總結(jié)”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“JavaScript中事件循環(huán)總結(jié)”吧!
js中的事件循環(huán)
因?yàn)镴avaScript是單線程的,同一事件只能執(zhí)行一種方法,所以會(huì)將程序中的方法加入到執(zhí)行棧中按照后進(jìn)先出的順序依次執(zhí)行,當(dāng)遇見異步任務(wù)時(shí)不會(huì)被阻塞,而是將任務(wù)放入事件隊(duì)列中,繼續(xù)執(zhí)行執(zhí)行棧中的同步代碼,等當(dāng)前執(zhí)行棧中的所有任務(wù)都執(zhí)行完畢則查找事件隊(duì)列中的任務(wù),并把任務(wù)的回調(diào)函數(shù)放入執(zhí)行棧中,執(zhí)行其中的同步代碼,如此反復(fù)形成的循環(huán)被稱為事件循環(huán)。
node.js
node.js特點(diǎn)
事件驅(qū)動(dòng)
從上向下執(zhí)行代碼,當(dāng)遇到需要回調(diào)的地方就加入到事件隊(duì)列中,主線程運(yùn)行完就去執(zhí)行事件隊(duì)列中的回調(diào)。整個(gè)過程不會(huì)阻塞新的事件,也不需要維護(hù)已經(jīng)建立的事件
非阻塞io
主線程空閑時(shí),就開始循環(huán)事件隊(duì)列,處理事件隊(duì)列中的事件,如果該事件不是io任務(wù)就親自處理,如果是io任務(wù),則交給線程池處理并指定回調(diào)函數(shù),然后繼續(xù)循環(huán)隊(duì)列中的其他事件,當(dāng)阻塞操作完成后會(huì)將結(jié)果和回調(diào)函數(shù)放入隊(duì)列中,主線程循環(huán)到時(shí)就執(zhí)行該回調(diào)函數(shù)。
node.js優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
高并發(fā):node.js用一個(gè)主線程處理所有的請(qǐng)求,然后對(duì)io操作進(jìn)行異步處理,避開了創(chuàng)建、銷毀線程以及在線程之間切換所需的開銷和復(fù)雜性
適合io密集型應(yīng)用
缺點(diǎn):
不適合CPU密集型應(yīng)用:長時(shí)間的計(jì)算會(huì)導(dǎo)致cpu時(shí)間片不能釋放,使得后續(xù)io事件無法發(fā)起
不能充分利用多核cpu
可靠性低,一旦代碼某個(gè)環(huán)節(jié)崩潰,整個(gè)系統(tǒng)都會(huì)崩潰
適用場(chǎng)景:
restful api:請(qǐng)求和響應(yīng)只需少量的文本,不需要大量的邏輯處理??梢蕴幚頂?shù)萬條連接,只需請(qǐng)求api組織數(shù)據(jù)并返回即可
大量Ajax請(qǐng)求的場(chǎng)景中
聊天服務(wù):輕量級(jí),高流量,沒有復(fù)雜的計(jì)算邏輯
node.js的事件循環(huán)
node事件循環(huán)依靠libuv引擎,v8解釋js代碼后調(diào)用對(duì)應(yīng)的node api,這些api由libuv引擎驅(qū)動(dòng)執(zhí)行對(duì)應(yīng)任務(wù),并把不同的事件放入不同的隊(duì)列中等待主線程執(zhí)行,因此node的事件循環(huán)存在于libuv引擎中。
libuv引擎:實(shí)現(xiàn)了事件循環(huán)、文件操作等,是node.js實(shí)現(xiàn)異步的核心
node.js的單線程僅僅指JavaScript運(yùn)行在單線程中,內(nèi)部可以通過線程池完成io操作
poll(查詢階段)---》check(檢查階段)---》close callback(關(guān)閉事件回調(diào)階段)---》timer(定時(shí)器檢測(cè)階段)---》io回調(diào)階段---》閑置階段---》輪詢階段
poll階段(輪詢階段):
v8將js代碼解析后傳入libuv引擎中,循環(huán)首先進(jìn)入poll階段。先查看poll隊(duì)列是否有事件,有就按先進(jìn)先出順序執(zhí)行回調(diào)。
感謝各位的閱讀,以上就是“JavaScript中事件循環(huán)總結(jié)”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)JavaScript中事件循環(huán)總結(jié)這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。