偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Javascript-單線程,非阻塞,異步,并發(fā)語(yǔ)言

開(kāi)發(fā) 前端
自從遇到React以來(lái),我一直致力于。現(xiàn)在,要成為一個(gè)更好的程序員,您必須問(wèn)為什么事情如何進(jìn)行。Javascript運(yùn)行時(shí)對(duì)我來(lái)說(shuō)是最大的奧秘之一。

恩,什么?我使用語(yǔ)言來(lái)完成工作。對(duì)于我和Javascript,此過(guò)程始于構(gòu)建一個(gè)小型游戲,ajax請(qǐng)求和表單驗(yàn)證。我們與Hapi js的聯(lián)系越來(lái)越深。自從遇到React以來(lái),我一直致力于。現(xiàn)在,要成為一個(gè)更好的程序員,您必須問(wèn)為什么事情如何進(jìn)行。Javascript運(yùn)行時(shí)對(duì)我來(lái)說(shuō)是最大的奧秘之一。

[[374817]]

什么是Javascript引擎和運(yùn)行時(shí)?

Javascript運(yùn)行時(shí)是指在運(yùn)行JavaScript代碼時(shí)在何處執(zhí)行。就是說(shuō),可以在google chrome上執(zhí)行javascript,在這種情況下,您的javascript引擎是v8,如果在mozilla上-它是Spidermonkey,如果是IE-那么它的脈輪,如果是Safari-它是nitro,如果在節(jié)點(diǎn)上,則是v8。現(xiàn)在什么是JS引擎,什么是JS運(yùn)行時(shí)?

引擎將我們編寫(xiě)的JavaScript轉(zhuǎn)換為機(jī)器代碼。所有JavaScript引擎都實(shí)現(xiàn)ECMAScript提供的語(yǔ)言規(guī)范。標(biāo)準(zhǔn)化促進(jìn)了獨(dú)立引擎的開(kāi)發(fā),并確保您的腳本無(wú)論在何處運(yùn)行都可以得到相同的結(jié)果。為了獲得速度,V8將JavaScript代碼轉(zhuǎn)換為更有效的機(jī)器代碼,而不是使用解釋器。它通過(guò)像許多現(xiàn)代JavaScript引擎(例如SpiderMonkey或Rhino(Mozilla))一樣實(shí)現(xiàn)JIT(即時(shí))編譯器,在執(zhí)行時(shí)將JavaScript代碼編譯為機(jī)器代碼。這里的主要區(qū)別是V8不會(huì)產(chǎn)生字節(jié)碼或任何中間碼。JavaScript引擎只是更大概念的組成部分。該引擎在稱(chēng)為Javascript Runtime的環(huán)境中工作,該環(huán)境為我們的腳本提供了附加功能。這些功能可能包括撥打網(wǎng)絡(luò)電話,捕獲鼠標(biāo)/鍵盤(pán)事件等。

這是JS Runtime的體系結(jié)構(gòu)。V8沒(méi)有這些WebAPI。這些由運(yùn)行時(shí)給出。在chrome瀏覽器JS運(yùn)行時(shí)中,瀏覽器擁有它,而在Node中則由C ++庫(kù)提供。

Javascript-單線程,非阻塞,異步,并發(fā)語(yǔ)言

> Runtime Architecture

讓我們看看Javascript是如何異步和單線程的。

單線程,什么?

Javascript代碼在單線程中執(zhí)行,但是Javascript運(yùn)行時(shí)不在單線程中運(yùn)行。線程池存在于JS運(yùn)行時(shí)中,但是我們不必?fù)?dān)心它,因?yàn)檫\(yùn)行時(shí)會(huì)處理它。但是,那是怎么做的呢?事件循環(huán)可以挽救。

讓我們了解什么是運(yùn)行時(shí)(或?qū)儆谶\(yùn)行時(shí)的JS引擎)中的堆和調(diào)用堆棧。javascript代碼首先轉(zhuǎn)換為機(jī)器代碼。堆存儲(chǔ)所有變量,并由調(diào)用堆棧執(zhí)行操作。

  1. console.log("Start") 
  2.  
  3. function sayHello(name) {  
  4.   console.log(`Hello ${name}!`) 
  5.  
  6. sayHello("Abhinav"); 
  7. console.log("End") 

所有這些都轉(zhuǎn)到調(diào)用堆棧并在那里執(zhí)行。

  • Start
  • Hello Abhinav
  • End

我們可以將腳本分為兩種類(lèi)型,即立即調(diào)用和稍后調(diào)用。

異步任務(wù)到來(lái)時(shí)會(huì)發(fā)生什么?任務(wù)需要時(shí)間才能運(yùn)行。比如說(shuō)進(jìn)行API調(diào)用或計(jì)時(shí)器等。有一個(gè)稱(chēng)為回調(diào)的概念。這是完成此任務(wù)后要執(zhí)行的功能。

好吧,它們作為任何常規(guī)函數(shù)進(jìn)入調(diào)用堆棧,但是由于此任務(wù)駐留在WebAPI中,因此我們對(duì)WebAPI進(jìn)行了調(diào)用。它存儲(chǔ)任務(wù)的回調(diào)函數(shù)并為我們完成任務(wù)(根據(jù)運(yùn)行時(shí)使用線程/多處理)。任務(wù)完成后,它將回調(diào)發(fā)送到回調(diào)隊(duì)列。

在這里再次可視化。

現(xiàn)在什么是事件循環(huán)?事件循環(huán)連續(xù)運(yùn)行(在瀏覽器運(yùn)行時(shí)中,它并不總是在節(jié)點(diǎn)中運(yùn)行)以檢查調(diào)用棧是否為空,如果調(diào)用棧為空,它將從回調(diào)隊(duì)列中提取第一項(xiàng)并將其移至調(diào)用棧并執(zhí)行回調(diào)函數(shù)。在堆棧不為空之前,不會(huì)從回調(diào)隊(duì)列添加任何功能。

回調(diào)總是完全執(zhí)行的。事件循環(huán)一次運(yùn)行一個(gè)回調(diào)。沒(méi)有上下文切換。隊(duì)列中的所有回調(diào)都必須等到當(dāng)前的回調(diào)完成。如果腳本運(yùn)行時(shí)間過(guò)長(zhǎng),則會(huì)阻止其他腳本。這就是為什么回調(diào)應(yīng)該相對(duì)簡(jiǎn)短而簡(jiǎn)單。

很簡(jiǎn)單吧!但實(shí)際上,它要復(fù)雜得多。有多個(gè)隊(duì)列,具體取決于運(yùn)行時(shí),并且它們的優(yōu)先級(jí)不同。有一些東西作為渲染隊(duì)列。誰(shuí)的工作是渲染屏幕。

非阻塞狀態(tài)如何?

假設(shè)您在調(diào)用API時(shí)失敗,或者發(fā)生了其他事件,該事件仍然存在于Web api中,因此它永遠(yuǎn)不會(huì)進(jìn)入回調(diào)隊(duì)列,因此不會(huì)進(jìn)入調(diào)用堆棧。因此,沒(méi)有任何東西被阻止。

它是并發(fā)的嗎?

并行和并行有什么區(qū)別?并行是您同時(shí)執(zhí)行2個(gè)任務(wù)的位置。(邊吃爆米花邊看電影)。這是通過(guò)多核來(lái)實(shí)現(xiàn)的。JS代碼在調(diào)用堆棧中并行執(zhí)行,而不是并行執(zhí)行。但是WebAPI可以利用多核并并行運(yùn)行。

原文鏈接:

https://theflyingmantis.medium.com/javascript-single-threaded-non-blocking-asynchronous-concurrent-language-ffae97c57bef)

 

責(zé)任編輯:趙寧寧 來(lái)源: 今日頭條
相關(guān)推薦

2018-01-11 08:24:45

服務(wù)器模型詳解

2024-02-26 00:00:00

JavaScript單線程高效

2017-03-06 14:08:38

JavaScript單線程setTimeout

2019-11-25 10:13:52

Redis單線程I

2009-07-10 09:05:20

SwingWorker

2020-10-30 16:20:38

Redis單線程高并發(fā)

2021-05-21 09:36:42

開(kāi)發(fā)技能代碼

2016-11-28 09:08:43

java系統(tǒng)異步非阻塞

2019-05-06 11:12:18

Redis高并發(fā)單線程

2019-05-07 09:44:45

Redis高并發(fā)模型

2025-06-17 00:22:00

2024-09-23 17:15:28

Python并發(fā)并行

2020-11-09 09:33:37

多線程

2022-07-07 09:12:17

JavaScript線程循環(huán)機(jī)制

2022-08-31 10:14:00

JavaScript網(wǎng)絡(luò)異步性

2010-08-30 08:55:56

JavaScript引

2022-01-04 11:11:32

Redis單線程Reactor

2021-08-16 15:49:31

開(kāi)發(fā)框架單線程異步

2020-06-16 14:19:50

Javascript多線程編程

2025-04-24 08:15:00

Redis單線程線程
點(diǎn)贊
收藏

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