【同步簡述】:當發出乙個「呼叫」時,在沒有得到結果之前,該「呼叫」就不返回,「呼叫者」需一直等待該「呼叫」結束,才能進行下一步工作。
【特點】:呼叫方主動
等待。
【舉例】:假設你給隔壁老王打**,要他家wifi密碼,老王說他要找一下。這時你沒有掛**,而是一直等待另一頭的老王找了半天,直到等待他把wifi密碼找到告訴你(返回乙個結果)後,你才掛了**去切菜。以下是python**演示同步程式:
# 普通同步**實現多個任務
import time
def task_1()
:print
('給老王打**問他要wifi密碼...'
) time.
sleep(3
) # 假設老王找密碼耗時3s
print
('老王找到密碼並告知,耗時3s'
)def task_2()
:print
('你開始切菜...'
) time.
sleep(2
) # 假設你切菜耗時2s
print
('你切完菜,耗時耗時2s'
)start = time.
time()
task_1()
task_2()
print
('所有任務總耗時%.5f秒'
%float
(time.
time()
-start)
)
執行結果如下:
給老王打**問他要wifi密碼...
老王找到密碼並告知,耗時3s
你開始切菜...
你切完菜,耗時耗時2s
所有任務總耗時5.00574秒
【非同步簡述】:「呼叫」在發出之後,就直接返回了,也就沒有返回結果。「被呼叫者」完成任務後,通過狀態來通知「呼叫者」繼續回來處理該「呼叫」。
【特點】:呼叫方被動
等待。
【舉例】依然是上面的案例,你給隔壁老王打**,要他家wifi密碼,老王說他要找一下。這時你說讓他慢慢找,等找到後在給你打**告知,於是你便變掛了**去切菜。以下是python呼叫asyncio
庫實現非同步:
import time
import asyncio
async def task_1()
:print
('給老王打**問他要wifi密碼......'
)await asyncio.
sleep(3
) # 假設耗時3s
print
('老王找到密碼並告知,耗時3s'
)async def task_2()
:print
('你開始切菜...'
)await asyncio.
sleep(2
) # 假設耗時2s
print
('你切完菜,耗時2s'
)async def main()
: # 呼叫方
tasks =
[task_2()
,task_1()
] # 把所有任務新增到task中
await asyncio.
wait
(tasks) # 子生成器
if __name__ ==
'__main__'
: start = time.
time()
loop = asyncio.
get_event_loop
() # 建立乙個事件迴圈物件loop
try: loop.
run_until_complete
(main()
) # 完成事件迴圈,直到最後乙個任務結束
finally
: loop.
close
() # 結束事件迴圈
print
('所有任務總耗時%.5f秒'
%float
(time.
time()
-start)
)
執行結果如下:
給老王打**問他要wifi密碼...
...你開始切菜...
你切完菜,耗時2s
老王找到密碼並告知,耗時3s
所有任務總耗時3.00673秒
【總結】:同步與非同步更關注的是訊息通訊機制
,說白了就是通訊方式。同步是主動等待式通訊,非同步是被動等待式通訊。
【阻塞呼叫概念】:是指呼叫結果返回之前,當前執行緒會被掛起
。函式只有在得到結果之後才會返回。
【舉例】:依然是你給隔壁老王打**,要他家wifi密碼,老王說他要找一下。這時你沒有掛**,而是把自己這個執行緒給掛起
了(即該執行緒被置於睡眠(sleep)狀態),為的是先不去切菜而是默默等老王給你密碼,等他告訴你密碼後(執行緒被喚醒),你再去切菜。此處的阻塞呼叫指的是你被掛起
、被置於睡眠的這種狀態。
【非阻塞呼叫概念】:是指在不能立刻得到結果之前,該函式不會阻塞當前執行緒,而會立刻返回。
【舉例】依然是上面的案例,你給隔壁老王打**,要他家wifi密碼,老王說他要找一下。這時你說讓他慢慢找,等找到後在給你打**告知,於是你便變掛了**去執行下乙個切菜任務。此處的非阻塞呼叫指的是你在處理這些任務時,不需要被掛起,而可以去執行其他任務的狀態。
【總結】
特點區別
同步主動等待
強調訊息通訊機制
非同步被動等待
強調訊息通訊機制
阻塞被掛起
強調程式等待結果的狀態
非阻塞不會被掛起
強調程式等待結果的狀態
阻塞和非阻塞,同步和非同步的形象通俗解釋
故事 老王燒開水。出場人物 老張,水壺兩把 普通水壺,簡稱水壺 會響的水壺,簡稱響水壺 老王想了想,有好幾種等待方式 1.老王用水壺煮水,並且站在那裡,不管水開沒開,每隔一定時間看看水開了沒。同步阻塞 老王想了想,這種方法不夠聰明。2.老王還是用水壺煮水,不再傻傻的站在那裡看水開,跑去寢室上網,但是...
非同步與同步 阻塞和非阻塞
非同步與同步 阻塞和非阻塞 總是讓人覺得難以理解 實際上常用的函式是都是同步的,很多io函式也是預設的阻塞的。同步是最常見的,就是一步一步的執行函式,執行完返回。他簡單,你不需要額外的去考慮,這是很自然的事情。阻塞是說當檔案描述符不可用的時候,就等待,等到他可用。對於乙個函式來說,非阻塞時可以設定的...
阻塞與非阻塞 同步和非同步
阻塞與非阻塞 主要指的是訪問 io 的執行緒是否會阻塞 或者說是等待 執行緒訪問資源,該資源是否準備就緒的一種處理方式。同步和非同步 主要是指的資料的請求方式 同步和非同步是指訪問資料的一種機制 bio同步阻塞 io,block io,io 操作時會阻塞執行緒,併發處理能力低。我們熟知的 socke...