完全搞清 同步,異步,阻塞,非阻塞的概念性知識

IO

須要先對 IO 的概念有必定的認識:php

  • 咱們一般使用php的fopen打開文件關閉文件讀讀寫寫, 這叫本地文件IO;
  • 而在socket編程中, 本質實際上是網絡IO;

同步異步阻塞非阻塞

以前反正一直搞不清楚同步和阻塞, 異步和非阻塞的概念, 總感受同步就是阻塞, 異步就是非阻塞的, 老是搞得暈乎乎的, 因而就從新查了些資料進行了梳理, 若有不對歡迎你們指正;前端

簡單來講

同步: 同步體如今, 在等待一件事情的處理結果時, 對方是否提供通知服務, 若是對方不提供通知服務, 則爲 同步;ajax

異步: 異步體如今, 在等待一件事情的處理結果時, 對方是否提供通知服務, 若是對方提供通知服務, 則爲 異步;編程

  • 對於常見的Ajax請求, 前端在ajax請求後一般還會執行一些其餘加載操做(非阻塞); 在server端處理完後, 會將數據'通知'到前端頁面;
  • 而對於最近正好在看的RabbitMQ消息隊列系統, 雖然本質上來講也是異步的(它是經過分隔了數據的發送和接收來解耦應用, 數據在最終被消費者處理完後也不會通知到生產者, 由於消息系統採用了不少手段如持久化, 重試等來確保消息必定會被執行), 但實質上, 消息會在發送成功後會當即獲得響應, 因此單就生產者成功生產消息這一步來講, 實際上是同步的;

阻塞: 阻塞體如今, 在等待一件事情的處理結果時, 你是否還去幹點其餘的事情, 若是不去, 則爲 阻塞;微信

非阻塞: 非阻塞體如今, 在等待一件事情的處理結果時, 你是否還去幹點其餘的事情, 若是去了, 則爲 非阻塞;網絡

結合例子來講

此處找了一位朋友寫的例子, 感受很不錯
同步阻塞: 你去 甜在心饅頭 店買太極饅頭, 阿梅說:"暫時沒, 正在蒸呢, 你本身看着點兒!", 因而你就站在旁邊只等饅頭, 此時的你, 是阻塞的, 也是同步的;異步

  • 阻塞表如今你除了等饅頭,別的什麼都不作了;
  • 同步表如今等饅頭的過程當中, 阿梅不提供通知服務, 你不得不本身主動檢查 "饅頭出爐" 的消息;

同步非阻塞: 你去甜在心饅頭店買太極饅頭, 阿梅說:"暫時沒, 正在蒸呢, 你本身看着點兒!", 因而你就站在旁邊發發微信, 而後問一句:"好了沒?", 而後玩玩QQ遊戲, 而後再問一句:"好了沒?", 此時的你, 是非阻塞的, 不過卻仍是同步的;socket

  • 非阻塞表如今你除了等饅頭, 本身還在幹別的事情;
  • 同步表如今等饅頭的過程當中, 因爲阿梅不提供通知服務, 你不得不本身主動檢查 "饅頭出爐" 的消息;

異步阻塞: 你去甜在心饅頭店買太極饅頭, 阿梅說:"暫時沒, 正在蒸呢, 蒸好了我打電話告訴你!", 但你依然站在旁邊只等饅頭, 此時的你, 是阻塞的, 是異步的;code

  • 阻塞表如今你除了等饅頭, 也沒去幹點別的什麼(好比玩玩手機啥的);
  • 異步表如今等饅頭的過程當中, 阿梅提供電話通知"饅頭出爐"的消息, 你只須要等阿梅的電話;

異步非阻塞: 你去甜在心饅頭店買太極饅頭, 阿梅說:"暫時沒, 正在蒸呢, 蒸好了我打電話告訴你!", 因而你就走了, 去買了雙新球鞋, 看了看武館, 總之, 今後再也不過問饅頭的事情, 一心只等阿梅電話, 此時的你, 是非阻塞的, 是異步的server

  • 非阻塞表如今你除了等饅頭, 本身還去幹點別的事情;
  • 異步表如今等饅頭的過程當中, 阿梅提供電話通知"饅頭出爐"的消息, 你只須要等阿梅的電話;
相關文章
相關標籤/搜索