形象理解同步和非同步與阻塞和非阻塞

2021-09-25 22:37:59 字數 3250 閱讀 9028

【同步簡述】:當發出乙個「呼叫」時,在沒有得到結果之前,該「呼叫」就不返回,「呼叫者」需一直等待該「呼叫」結束,才能進行下一步工作。

【特點】:呼叫方主動等待

【舉例】:假設你給隔壁老王打**,要他家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...