非同步、同步、阻塞、非阻塞

MaChao發表於2020-10-28
  • 同步就是一個任務的完成需要依賴另外一個任務時,只有等待被依賴的任務完成後,依賴的任務才能算完成,這是一種可靠的任務序列。

  • 非同步是不需要等待被依賴的任務完成,只是通知被依賴的任務要完成什麼工作,依賴的任務也立即執行,只要自己完成了整個任務就算完成了。

  • 阻塞呼叫是指呼叫結果返回之前,當前執行緒會被掛起,一直處於等待訊息通知,不能夠執行其他業務。

  • 非阻塞呼叫指在不能立刻得到結果之前,該函式不會阻塞當前執行緒,而會立刻返回。


非同步、同步是發生在使用者空間內,當使用者發起一個IO的呼叫的時候,同步的時候,如果這個操作比較耗時間,會阻塞後面的流程。

file_get_contents("http://www.qq.com/");
echo "end";

呼叫read的操作的時候。後面的操作echo 會等待上面的結果完成,才能繼續。

這個aysnc_read 是一個非同步讀的操作,當讀的時候,底下的操作不會阻塞住,會先輸出end。當資料到達的時候,再echo $data;

aysnc_read("http://www.qq.com",function($data){
    echo $data;
})
echo "end";

阻塞、非阻塞、發生在核心和使用者空間之間。
阻塞是指作業系統會掛起程式,直到資料準備好,非阻塞、作業系統不阻塞,當前程式可以繼續執行。

阻塞io
張三去書店買書,然後問書店問老闆,有沒有《紅樓夢》,老闆說我查下,這個查詢的時間,比較長,然後張三啥都不能幹,就在等著。直到老闆告訴它,找到了。然後買了這個書,走了。張三的操作都是同步阻塞的,必須等待老闆的結果,下面的操作才能執行。

非阻塞IO
還是張三去買書,老闆去查詢。這是時候,張三可以玩手機,然後隔段時間問,找到了沒有,張三的程式沒有被阻塞。但是這個任務是同步的,必須等待這個結果。就是老闆沒有告訴張三結果,張三是不能離開幹其他的事。這個過程是同步非阻塞的。

非同步IO
張三去買書。然後去書店問老闆有沒有了。老闆需要查詢,張三告訴老闆自己的手機號,找到了打電話給我,然後就去幹其他的事了。這個過程是非同步的。張三的程式沒有被阻塞在這個買書的環節上。這就是非同步非阻塞。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章