眾所周知JavaScript的執行環境是單線程的,當有多任務時,先執行前面的任務再按順序獅子那個后面一個,如果前面一個任務耗時很長,那么多所有任務都將拖延,比如經常遇到的瀏覽器無響應其實就是因為某一段JavaScript代碼長時間運行(死循環),導致其他任務無法執行,整個頁面無法繼續加載造成的,這就是阻塞
為了解決單線程阻塞問題,就出現一種異步編程,典型的異步編程就例如: Node.Js
同步和異步實際上關注的是消息通信機制
所謂同步,就是發出一個調用時,沒有得到結果就不返回
所謂異步,就是發布一個調用后,立刻返回,被調用者通過狀態通知來告訴調用者,或者通過回調函數處理
阻塞與非阻塞實際上關注的是程序在等待調用結果時的狀態,可能是消息,可能是返回值
所謂阻塞,就是指調用結果返回前,當前線程會被掛起,調用線程只有在得到結果之后才會返回
所謂非阻塞,是指在不能立刻得到結果前,該調用不會阻塞當前線程
這時候,或許對同步異步,阻塞非阻塞有了一個概念,那如果,我們將它們互相組合起來呢?
同步阻塞,老王用燒水壺燒開水,等水開了然后炒菜
同步非阻塞,老王用燒水壺燒開水,然后去炒菜,隔一段時間看一下水燒開了沒
異步阻塞,老王買了個燒開了水回響的燒水壺,然后等著水燒開了去炒菜
異步非阻塞,老王用那個會響的燒水壺燒水,然后去炒菜,等水壺響了再去拿水壺
同步阻塞是最原始最笨的辦法,他要一直等著水燒開了。同步非阻塞其實是用到了輪詢、IO復用、協程等方法,每隔一段時間去看一下是不是燒開了。異步阻塞是個很“叛逆”的問題,一般很少用到,但是還是有這種情況的。異步非阻塞,那就是用到了回調函數和通知方式。
大膽推測,異步最終會變成某種形式或者狀態的同步,也就是消息或者回調,消息是進程間的通信,回調本身就是一種同步,只是采取了快響應,慢處理的策略,推后了同步的時間
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。