關於python中同步、異步,阻塞、非阻塞的理解


同步、異步,阻塞、非阻塞的理解

異步:某個事情需要10秒。而我只需要調用一個函數幫我做,我可以干 其他的事情。(比如調用celery)

同步:某個事情需要10秒完成,我等他完成之后再繼續后面的工作。

 

舉例:金拱門排隊取餐

        第一種方式(同步),下單拿號之后自己排隊取餐。

        第二種方式(異步),下單之后可以坐在一旁等待叫號,等待事件觸發。

 

阻塞:阻塞調用是指調用結果返回之前,當前線程會被掛起,一直處於等待消息通知,不能夠執行其他業務,等待當前函數返回.

 

阻塞調用和同步調用不同點

對於同步調用來說,很多時候當前線程可能還是激活的,只是從邏輯上當前函數沒有返回而已,此時,這個線程可能也會處理其他的消息。

還有一點,在這里先擴展下:

a:如果這個線程在等待當前函數返回時,仍在執行其他消息處理,那這種情況就叫做同步非阻塞

b:如果這個線程在等待當前函數返回時,沒有執行其他消息處理,而是處於掛起等待狀態 ,那這種情況就叫做同步阻塞

所以同步的實現方式會有兩種:同步阻塞同步非阻塞;同理異步也會有兩種實現:異步阻塞異步非阻塞

 

非阻塞:非阻塞和阻塞的概念相對應,指在不能立刻得到結果之前,該函數不會阻塞當前線程,而會立刻返回。雖然表面上看非阻塞的方式可以明顯的提高CPU的利用率,但是也帶了另外一種后果,就是系統的線程切換增加。增加的CPU執行時間能不能補償系統的切換成本需要

好好評估。

 

拿上面的例子來說,不論是排隊等,還是等待通知,如果在這個過程中,等待者除了等待消息通知之外不能做其它的事情,那么該機制就是阻塞的,表現在程序中,也就是該程序一直阻塞在該函數調用處不能繼續往下執行。

 

相反,有的人喜歡在等待的時候一邊刷刷手機或者打打游戲,這樣的狀態就是非阻塞的,因為他沒有阻塞在這個事情上,而是一邊做自己的事情一邊等待,但是同步非阻塞形式實際上是效率低下的,想象一下你一邊打游戲還需要抬頭看到底隊伍排到你了沒有。如果把打游戲和觀察排隊進行看成是程序的兩個操作的話,這個程序需要在這兩種不同的行為之間來回的切換,效率可想而知是低下的;而異步非阻塞形式就不存在這樣的問題,因為打游戲是你的事,而通知你則是服務人員的事情(觸發機制),程序沒有在兩種不同的操作中來回切換。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM