JavaScript是「單執行緒 非同步」的

2021-08-04 07:17:24 字數 615 閱讀 2731

所謂單執行緒,是指負責解釋並執行js**的執行緒只有乙個。我們不妨叫它主線程。

其實還有其他很多執行緒的,比如進行ajax請求的執行緒、監控使用者事件的執行緒、定時器執行緒、讀寫檔案的執行緒(例如在nodejs中)等等。

同步和非同步是怎麼回事?以ajax請求為例:

非同步就是:主線程執行到傳送ajax請求的**時,通知負責處理ajax請求的執行緒(不妨叫做ajax執行緒):「你給我發個請求吧,我把請求位址和引數都給你了」。然後主線程就不管這事兒了,繼續執行後面的**。等ajax執行緒收到http響應的時候,就通知主線程:「你的響應來了,快來取吧」。主線程在合適的時候就會去取響應,進行適當的處理。

多說一句:ajax執行緒通知主線程的方式就是所謂的事件佇列和事件迴圈機制。

同步就是:主線程執行到傳送ajax請求的**時,它還是要通知ajax執行緒幫它發請求,但是它也停下來,啥都不幹,等著接收響應。如果響應5秒後才拿到,那麼他就等5秒。直到拿到響應後處理完了,才繼續解釋和執行接下來的**。

所以,非同步就是幹某件事情(尤其是耗時的事情)的時候,不幹等著,交給別人做,自己幹其他事情,同時等通知。同步就是傻傻地等著。

現在你明白了,對於只有乙個執行**的執行緒的語言,如果沒有非同步是不行的。

redis底層是單執行緒

一直有個錯覺就是,redis底層命令是併發執行的,但今天檢視若干資料後發現,redis底層是單執行緒的,也就是說多客戶端向redis伺服器傳送操作命令,redis底層是序列執行的,這樣不禁懷疑這樣不是很慢嗎?後經過進一步 得出結論 1 單執行緒並不一定比多執行緒慢,多執行緒需要不停切換上下文,本身就...

javascript中的非同步和單執行緒

非同步 非同步和同步的最大區別在於有沒有阻塞程式執行何時需要非同步 需要等待情況 等待過程不能像alert一樣 前端非同步使用場景 定時任務 settimeout setinterval 網路請求 ajax請求 動態載入 事件繫結 ajax請求 示例 console.log start get da...

Redis是多執行緒還是單執行緒?

沒錯,大家所熟知的 redis 確實是單執行緒模型,指的是執行 redis 命令的核心模組是單執行緒的,而不是整個 redis 例項就乙個執行緒,redis 其他模組還有各自模組的執行緒的。下面這個解釋比較好 一般來說 redis 的瓶頸並不在 cpu,而在記憶體和網路。如果要使用 cpu 多核,可...