同步非同步,阻塞非阻塞

山有木xi發表於2020-03-20

眾所周知JavaScript的執行環境是單執行緒的,當有多工時,先執行前面的任務再按順序獅子那個後面一個,如果前面一個任務耗時很長,那麼多所有任務都將拖延,比如經常遇到的瀏覽器無響應其實就是因為某一段JavaScript程式碼長時間執行(死迴圈),導致其他任務無法執行,整個頁面無法繼續載入造成的,這就是阻塞

為了解決單執行緒阻塞問題,就出現一種非同步程式設計,典型的非同步程式設計就例如: Node.Js 

同步和非同步實際上關注的是訊息通訊機制

  • 所謂同步,就是發出一個呼叫時,沒有得到結果就不返回

  • 所謂非同步,就是釋出一個呼叫後,立刻返回,被呼叫者透過狀態通知來告訴呼叫者,或者透過回撥函式處理

阻塞與非阻塞實際上關注的是程式在等待呼叫結果時的狀態,可能是訊息,可能是返回值

  • 所謂阻塞,就是指呼叫結果返回前,當前執行緒會被掛起,呼叫執行緒只有在得到結果之後才會返回

  • 所謂非阻塞,是指在不能立刻得到結果前,該呼叫不會阻塞當前執行緒

這時候,或許對同步非同步,阻塞非阻塞有了一個概念,那如果,我們將它們互相組合起來呢?

  • 同步阻塞,老王用燒水壺燒開水,等水開了然後炒菜

  • 同步非阻塞,老王用燒水壺燒開水,然後去炒菜,隔一段時間看一下水燒開了沒

  • 非同步阻塞,老王買了個燒開了水迴響的燒水壺,然後等著水燒開了去炒菜

  • 非同步非阻塞,老王用那個會響的燒水壺燒水,然後去炒菜,等水壺響了再去拿水壺

同步阻塞是最原始最笨的辦法,他要一直等著水燒開了。同步非阻塞其實是用到了輪詢、IO複用、協程等方法,每隔一段時間去看一下是不是燒開了。非同步阻塞是個很“叛逆”的問題,一般很少用到,但是還是有這種情況的。非同步非阻塞,那就是用到了回撥函式和通知方式。

大膽推測,非同步最終會變成某種形式或者狀態的同步,也就是訊息或者回撥,訊息是程式間的通訊,回撥本身就是一種同步,只是採取了快響應,慢處理的策略,推後了同步的時間




來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69917874/viewspace-2681684/,如需轉載,請註明出處,否則將追究法律責任。

相關文章