同步與異步 1234567

老實說,玩電腦也玩了好幾年了;印象中看到"同步和異步"關鍵字的次數已經記不清了,總感覺自己知道點什麼,但卻又說不出來什麼東西,這是爲啥?—— 因爲沒有深入理解,沒有總結;也應了那句古話:紙上學來終覺淺,絕知此事要躬行。 不賣關子了,開始進入正題。
”同步“就好比:你去外地上學(人生地不熟),突然生活費不夠了;此時你決定打電話回家,通知家裏轉生活費過來,可是當你撥出電話時,對方一直處於待接聽狀態(即:打不通,聯繫不上),爲了拿到生活費,你就不停的oncall、等待,最終可能不能及時要到生活費,導致你今天要做的事都沒有完成,而白白花掉了時間。
“異步”就是:在你打完電話發現沒人接聽時,猜想:對方可能在忙,暫時無法接聽電話,所以你發了一條短信(或者語音留言,亦或是其他的方式)通知對方後便忙其他要緊的事了;這時你就不需要持續不斷的撥打電話,還可以做其他事情;待一定時間後,對方看到你的留言便回覆響應你,當然對方可能轉錢也可能不轉錢。但是整個一天下來,你還做了很多事情。 或者說你找室友臨時借了一筆錢,又開始happy的上學時光了。
簡而言之,言而總之:同步就是我強依賴你(對方),我必須等到你的回覆,才能做出下一步響應。即我的操作(行程)是順序執行的,中間少了哪一步都不可以,或者說中間哪一步出錯都不可以,類似於編程中程序被解釋器順序執行一樣;同時如果我沒有收到你的回覆,我就一直處於等待、也就是阻塞的狀態。 異步則相反,我並不強依賴你,我對你響應的時間也不敏感,無論你返回還是不返回,我都能繼續運行;你響應並返回了,我就繼續做之前的事情,你沒有響應,我就做其他的事情。也就是說我不存在等待對方的概念,我就是非阻塞的。

從上面的例子來看:同步似乎等價於阻塞,異步則等價於非阻塞。其實有些狹義,但不可否認的是,在一定情況下,確實可以這麼認爲;因爲同步一定存在着阻塞狀態,而異步一定不存在非阻塞的狀態。 但是不是就是說 同步調用 == 阻塞調用呢?然並不是;阻塞和非阻塞強調的是程序在等待調用結果(消息,返回值)時的狀態. 阻塞調用是指調用結果返回之前,當前線程會被掛起。調用線程只有在得到結果之後纔會返回。非阻塞調用指在不能立刻得到結果之前,該調用不會阻塞當前線程。 對於同步調用來說,很多時候當前線程還是激活的狀態,只是從邏輯上當前函數沒有返回而已,即同步等待時什麼都不幹,白白佔用着資源。同步和異步強調的是消息通信機制 (synchronous communication/ asynchronous communication)。所謂同步,就是在發出一個"調用"時,在沒有得到結果之前,該“調用”就不返回。但是一旦調用返回,就得到返回值了。換句話說,就是由“調用者”主動等待這個“調用”的結果。而異步則是相反,"調用"在發出之後,這個調用就直接返回了,所以沒有返回結果。換句話說,當一個異步過程調用發出後,調用者不會立刻得到結果。而是在"調用"發出後,"被調用者"通過狀態、通知來通知調用者,或通過回調函數處理這個調用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章