簡述JavaScript中 同步與異步,阻塞與非阻塞

不少開發者都說JavaScript是單線程的,可是單線程是如何實現異步的呢?然而並無詳細說過,其實JavaScript還有一條或者多條線程用來實現異步操做,也就是異步隊列。javascript

  舉個例子:html

    馬路上有不少車,一輛接一輛的排着跑,忽然排在最前面的車壞了,java

    這時候你是讓後面的全部的車都等它修好在一塊兒跑嗎?node

    然而是不可能的,那樣交通就亂掉了。python

    這時候就出現了應急車道,把壞的車挪到應急車道上去,web

    後面的車繼續跑,等壞的車修好了,在挪到車道上去正常跑。面試

    這就是JavaScript中的異步執行隊列。express

      什麼是同步什麼是異步呢?編程

    同步api

    簡而言之,同步就是從上往下依次執行,就像java,c,python等強類型的語言。都是順時同步執行,不多有異步操做。

    而同步就要求開發者的編碼要嚴謹,若是有疏忽,就會致使運行出錯,運行卡頓,致使用戶體驗差等,

    舉個簡單的例子說明什麼是同步執行

      // f1函數
      function f1() {
      console.log('f1', 1)
    }

    // f2函數

    function f2 () {
      console.log('f2', 2)
    }
    f1() // f1,1
    f2() // f2, 2

 

    這就是同步執行, f1() 在f2()的上面因此先執行 f1() 在執行f2() 簡單說就是一個先進先出的隊列。後者必須等待前者的結果出來纔會運行

    那麼若是我不想讓f2等着f1執行完在執行,我就想讓他正常執行呢? 那你就用異步函數編程就行 我推薦你們看一下阮一峯老師的異步函數式編程(http://www.ruanyifeng.com/blog/2012/12/asynchronous%EF%BC%BFjavascript.html

    ),固然面試的時候不推薦拿出來吹牛逼。

    異步

    那麼就把f2當成f1的參數,把f2寫成f1的回調函數,這樣f2不用再等待f1是否執行完成,只要過了1s就會執行f2函數

    function f1 (callback) {

      setTimeOut (() => {

        callBack()

      }, 1000)

    }

    f1(f2)

             阻塞

    什麼是阻塞?

    阻塞與非阻塞其實跟同步與異步並無什麼直接關係。要正確理解。不要說阻塞=同步,非阻塞=異步

    最多見的阻塞現象,例如  死循環, 用戶體驗差, 運行卡頓等。引發阻塞的緣由,就是一個api或者函數運行時,獨佔cpu致使其餘代碼沒法運行。

             爲何你們會把阻塞與同步聯繫在一塊兒了?

      開發者都知道同步代碼從上至下依次運行,當運行遭遇阻塞,後面的代碼天然而然不會運行。

            非阻塞呢?

    一說到非阻塞你們應該會想到   node, 由於nodejs最大的優勢就是他的 異步非阻塞IOnode中大部分都是異步的,包括基於node開發的express,koa等框架。

    node進程中,一個用戶線程(js單線程),一個異步線程池(用戶沒法直接訪問到),對於真正的阻塞代碼,好比異步中發生阻塞,若是跑在異步中的仍然是阻塞代碼,那麼這種異步根本起步到解決阻塞的做用,由於阻塞代碼會獨佔cpu,多以致使本進程上面的全部代碼都要等待,無論是哪一個線程,可是node的IO是不會霸佔cpu的,因此node最出色的就是他的異步非阻塞IO。真正碰到阻塞代碼,node也只能開多線程多服務來解決了,由於每一門語言必然有他的優勢與缺點,node自己就是爲了讓開發者更好的開發web後臺服務的。

    同步異步,阻塞與非阻塞就說到這裏了。

相關文章
相關標籤/搜索