同步异步 阻塞非阻塞
首先知道同步異步與阻塞非阻塞不是一個層次的概念
“阻塞”與"非阻塞"與"同步"與“異步"不能簡單的從字面理解,提供一個從分布式系統角度的回答。
1.同步與異步
同步和異步關注的是消息通信機制 (synchronous communication/ asynchronous communication)
所謂同步,就是在發出一個*調用*時,在沒有得到結果之前,該*調用*就不返回。但是一旦調用返回,就得到返回值了。
換句話說,就是由*調用者*主動等待這個*調用*的結果。
而異步則是相反,*調用*在發出之后,這個調用就直接返回了,所以沒有返回結果。換句話說,當一個異步過程調用發出后,調用者不會立刻得到結果。而是在*調用*發出后,*被調用者*通過狀態、通知來通知調用者,或通過回調函數處理這個調用。
例1:
之前一直在寫JQUERY代碼的時候遇到AJAX加載數據都需要考慮代碼運行順序問題。最近的項目用了到AJAX同步。這個同步的意思是當JS代碼加載到當前AJAX的時候會把頁面里所有的代碼停止加載,頁面出去假死狀態,當這個AJAX執行完畢后才會繼續運行其他代碼頁面假死狀態解除,而異步則這個AJAX代碼運行中的時候其他代碼一樣可以運行。?
jquery的async:false,這個屬性?
默認是true:異步,false:同步。
$.ajax({?
? ? ? ? ?type: "post",?
? ? ? ? ?url: "path",?
? ? ? ? ?cache:false,?
? ? ? ? ?async:false,?
? ? ? ? ?dataType: ($.browser.msie) ? "text" : "xml",?
???????? success: function(xmlobj){?
??????? }?
});
有了這個屬性可以相對的減少代碼運行書序問題,但是如果用的太多,頁面假死次數太多。這樣反而導致用戶體驗不佳~!
根據$.Ajax()中 async 和success的官方的解釋
async默認的設置值為true,這種情況為異步方式,就是說當ajax發送請求后,在等待server端返回的這個過程中,前臺會繼續 執行ajax塊后面的腳本,直到server端返回正確的結果才會去執行success,也就是說這時候執行的是兩個線程,ajax塊發出請求后一個線程 和ajax塊后面的腳本(另一個線程)例:
$.ajax({??
? ? ? ? ? ?type:"POST",?
? ? ? ? ? ?url:"Venue.aspx?act=init",?
?????????? dataType:"html",?
? ? ? ? ? ?success:function(result){?? //function1()
? ? ? ? ? ? f1();?
? ? ? ? ? ? f2();?
??????? }?
???????? failure:function (result) {??
??????????? alert('Failed');??
???????? },?
? }?
? function2();?
在上例中,當ajax塊發出請求后,他將停留function1(),等待server端的返回,但同時(在這個等待過程中),前臺會去執行function2(),也就是說,在這個時候出現兩個線程,我們這里暫且說為function1() 和function2()。
? ? ? ?當把asyn設為false時,這時ajax的請求時同步的,也就是說,這個時候ajax塊發出請求后,他會等待在function1()這個地方,不會去執行function2(),知道function1()部分執行完畢
例2:你打電話問書店老板有沒有《分布式系統》這本書,如果是同步通信機制,書店老板會說,你稍等,”我查一下",然后開始查啊查,等查好了(可能是5秒,也可能是一天)告訴你結果(返回結果)。
而異步通信機制,書店老板直接告訴你我查一下啊,查好了打電話給你,然后直接掛電話了(不返回結果)。然后查好了,他會主動打電話給你。在這里老板通過“回電”這種方式來回調。
2. 阻塞與非阻塞
阻塞和非阻塞關注的是程序在等待調用結果(消息,返回值)時的狀態.
阻塞調用是指調用結果返回之前,當前線程會被掛起。調用線程只有在得到結果之后才會返回。
非阻塞調用指在不能立刻得到結果之前,該調用不會阻塞當前線程。
還是上面的例子,
你打電話問書店老板有沒有《分布式系統》這本書,你如果是阻塞式調用,你會一直把自己“掛起”,直到得到這本書有沒有的結果,如果是非阻塞式調用,你不管老板有沒有告訴你,你自己先一邊去玩了, 當然你也要偶爾過幾分鐘check一下老板有沒有返回結果。
在這里阻塞與非阻塞與是否同步異步無關。跟老板通過什么方式回答你結果無關。
轉自:
https://www.zhihu.com/question/19732473/answer/20851256 作者:嚴肅
https://www.cnblogs.com/cai170221/p/7065096.html
轉載于:https://www.cnblogs.com/xdyixia/p/9260187.html
總結
以上是生活随笔為你收集整理的同步异步 阻塞非阻塞的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 可持续字典树 Perfect Secur
- 下一篇: 第七章:跨程序共享数据-探究内容提供器