如何理解PHP同步阻塞 和非同步IO?

2021-09-27 08:45:14 字數 1325 閱讀 4099

至於為什麼要寫這篇文章,是因為在近日有個小夥伴突然問我,什麼是同步?什麼是非同步?概念是什麼?如何理解?

我也相信還是有部分小夥伴在初級開發階段確實沒有太過於關注這個概念?這就說下我的理解!

先科普下io:(io)是input和output的縮寫,這個詞在很多地方都會出現,是什麼不用多解釋,通常被稱為:輸入(寫),輸出(讀)。通常就被稱為:讀寫!

同步:大家都知道程式的執行是從上而下的,就像我們平時開發的程式也就是一條線,這樣的程式就稱為同步。

舉個簡單的例子來說明一下(用程式實現乙個下單流程)

使用者提交訂單資料->處理資料->呼叫支付介面->將訂單資料儲存到資料庫->完成支付

用**實現也就是一步一步的處理,到支付結束為止,這樣的**就是同步**!

阻塞(同步程式的執行過程的io等待就被稱為阻塞)

正是大家看到的,同步的**就像是單點操作,需要一步一步的執行下去才能達到目的,那麼就需要等待程式從頭跑到尾的執行時間,這個執行時間包含了資料運算處理,讀寫資料庫,就比如我們下單過程,我們需要查詢資料庫訂單是否已經存在()、要將訂單資料儲存到資料庫(),程式必須等到讀寫成功了再執行下一步,在這個等待讀寫的過程通常就被稱為阻塞。通常同步程式都伴隨著阻塞,而在php程式中不支援多程序,那麼併發高的情況下,處理起來必定捉襟見肘了。

那麼如何解決阻塞帶來的問題?

所以高併發的情況下就引入了redis、訊息佇列(mq)、如果能夠使用多程序處理也是乙個不錯的方案,swoole的誕生,我覺得同步程式併發也將不是痛點。

說了同步接下來我們說下下非同步?

非同步:簡單來說就是不需要等待而又完成了同步的事情就被稱為非同步這個不是所有場景都適用。

下面我們也舉乙個簡單的例子說明一下,我們有乙個傳送10萬條郵件的需求,如果我們使用同步模式,需要傳送一封郵件之後才能傳送第二封,到10萬封也不知道要等待幾個日日夜夜了,這樣非同步的概念就產生了,我先建立乙個傳送的任務(也就是要把傳送的內容和位址存到資料庫),後來再寫程式讓他自動的去傳送郵件,這樣的程式就被稱為非同步。

非同步的優點:可以很大程度上提公升io,非同步程式很大程度上提高了使用者體驗,非同步可以開啟多程序處理,swoole 的出現,讓php的效能可以說能夠實現乙個飛躍性的成長。

非同步的缺點:並不是所有的程式都適合使用非同步,而且非同步建立程序會有很大的開銷,濫用非同步反而影響效能。

同步 非同步,阻塞 非阻塞理解

由於同步非同步,阻塞非阻塞都學習了有一段時間了。慢慢了快忘了,所以乾脆趁著寒假把知識點都撿起來,寫出來。同步和非同步是一組概念,阻塞和非阻塞是一組概念。大家不要搞混了,不要把同步和阻塞等價,也不要把非同步和非阻塞等價 戲說不是胡說,改編不是亂編 滑稽 在剛開始理解的時候很容易搞混,我們這樣想,同步和...

同步 非同步 阻塞和非阻塞的理解

這一段來自 處理大併發之一 對非同步非阻塞的理解 阻塞 執行緒在執行中如果遇到 i o 操作 如磁碟讀寫或網路通訊,通常要耗費較長的時間,這時作業系統會剝奪這個執行緒的 cpu 控制權,使其暫停執行,同時將資源讓給其他的工作執行緒,這種執行緒排程方式稱為 阻塞。當 i o 操作完畢時,作業系統將這個...

關於同步 非同步和阻塞 非阻塞的理解

有人說到,同步和非同步是從訊息通訊機制來看的,a 請求 b,如果a 需要等b的應答,則是同步 如果a不需要等b的應答,直接處理其他事情,則是非同步。這樣看起來也沒什麼問題。但是也有另外一種解釋,就是兩個事物的協同,或者兩個事情的執行順序是否是順序執行的,還是可以並行執行的。1 從程式設計 業務 層面...