對(duì)Python協(xié)程之異步同步的區(qū)別詳解
一下代碼通過(guò)協(xié)程、多線(xiàn)程、多進(jìn)程的方式,運(yùn)行代碼展示異步與同步的區(qū)別。
import gevent
import threading
import multiprocessing
# 這里展示同步和異步的性能區(qū)別,可以看到異步直接同時(shí)執(zhí)行并完成,
# 而同步,需要等待第一個(gè)完成后再次執(zhí)行下一個(gè),是有順序的執(zhí)行,而異步不需要
import time
def task(pid):
gevent.sleep(0.5)
print('Task %s done' % pid)
def task2(pid):
time.sleep(0.5)
print('Task %s done'%pid)
def synchronous():
for i in range(1, 10):
task(i)
def asynchronous():
threads = [gevent.spawn(task, i) for i in range(1,10)]
gevent.joinall(threads)
def thread_chronous():
t_list = []
for i in range(1,10):
t = threading.Thread(target=task2,args=(i,))
t.start()
t_list.append(t)
for j in t_list:
j.join()
def multi_chronous():
t_list = []
for i in range(1, 10):
t = multiprocessing.Process(target=task2, args=(i,))
t.start()
t_list.append(t)
for j in t_list:
j.join()
# 同步執(zhí)行
print('Synchronous:')
synchronous()
# 開(kāi)啟協(xié)程異步執(zhí)行 自動(dòng)切換函數(shù)
print('Asynchronous:')
asynchronous()
# 開(kāi)啟線(xiàn)程異步執(zhí)行
print('Threading')
thread_chronous()
# 開(kāi)啟進(jìn)程的異步執(zhí)行
if __name__ == '__main__':
print('Multiprocess')
multi_chronous()
關(guān)于異步 同步的一些理解:
同步和異步的區(qū)別就在于是否等待IO執(zhí)行的結(jié)果。好比你去麥當(dāng)勞點(diǎn)餐,你說(shuō)“來(lái)個(gè)漢堡”,服務(wù)員告訴你,對(duì)不起,漢堡要現(xiàn)做,需要等5分鐘,于是你站在收銀臺(tái)前面等了5分鐘,拿到漢堡再去逛商場(chǎng),這是同步IO。
你說(shuō)“來(lái)個(gè)漢堡”,服務(wù)員告訴你,漢堡需要等5分鐘,你可以先去逛商場(chǎng),等做好了,我們?cè)偻ㄖ?,這樣你可以立刻去干別的事情(逛商場(chǎng)),這是異步IO。
老張愛(ài)喝茶,廢話(huà)不說(shuō),煮開(kāi)水。出場(chǎng)人物:老張,水壺兩把(普通水壺,簡(jiǎn)稱(chēng)水壺;會(huì)響的水壺,簡(jiǎn)稱(chēng)響水壺)。
1 老張把水壺放到火上,立等水開(kāi)。(同步阻塞)老張覺(jué)得自己有點(diǎn)傻
2 老張把水壺放到火上,去客廳看電視,時(shí)不時(shí)去廚房看看水開(kāi)沒(méi)有。(同步非阻塞)老張還是覺(jué)得自己有點(diǎn)傻,于是變高端了,買(mǎi)了把會(huì)響笛的那種水壺。水開(kāi)之后,能大聲發(fā)出嘀~~~~的噪音。
3 老張把響水壺放到火上,立等水開(kāi)。(異步阻塞)老張覺(jué)得這樣傻等意義不大
4 老張把響水壺放到火上,去客廳看電視,水壺響之前不再去看它了,響了再去拿壺。(異步非阻塞)老張覺(jué)得自己聰明了。所謂同步異步,只是對(duì)于水壺而言。普通水壺,同步;響水壺,異步。雖然都能干活,但響水壺可以在自己完工之后,提示老張水開(kāi)了。這是普通水壺所不能及的。同步只能讓調(diào)用者去輪詢(xún)自己(情況2中),造成老張效率的低下。所謂阻塞非阻塞,僅僅對(duì)于老張而言。立等的老張,阻塞;看電視的老張,非阻塞。情況1和情況3中老張就是阻塞的,媳婦喊他都不知道。雖然3中響水壺是異步的,可對(duì)于立等的老張沒(méi)有太大的意義。所以一般異步是配合非阻塞使用的,這樣才能發(fā)揮異步的效用。
以上這篇對(duì)Python協(xié)程之異步同步的區(qū)別詳解就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python FastApi實(shí)現(xiàn)數(shù)據(jù)表遷移流程詳解
今天我們來(lái)聊一聊在FastApi里面,數(shù)據(jù)遷移工作,F(xiàn)astAPI是一個(gè)現(xiàn)代的,快速(高性能)python web框架。本文將利用fastapi實(shí)現(xiàn)數(shù)據(jù)表遷移功能,文中的示例代碼講解詳細(xì),需要的可以參考一下2022-08-08
解決Django一個(gè)表單對(duì)應(yīng)多個(gè)按鈕的問(wèn)題
今天小編就為大家分享一篇解決Django一個(gè)表單對(duì)應(yīng)多個(gè)按鈕的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07
python實(shí)現(xiàn)批量獲取指定文件夾下的所有文件的廠(chǎng)商信息
這篇文章主要介紹了python實(shí)現(xiàn)批量獲取指定文件夾下的所有文件的廠(chǎng)商信息的方法,是非常實(shí)用的技巧,涉及到文件的讀寫(xiě)與字典的操作等技巧,需要的朋友可以參考下2014-09-09
解決jupyter notebook圖片顯示模糊和保存清晰圖片的操作
這篇文章主要介紹了解決jupyter notebook圖片顯示模糊和保存清晰圖片的操作方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04
解決plt.imshow顯示cv2.imread讀取的圖像有色差發(fā)藍(lán)的四種方法問(wèn)題
本文主要介紹了解決plt.imshow顯示cv2.imread讀取的圖像有色差發(fā)藍(lán)的四種方法問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
python+mysql實(shí)現(xiàn)教務(wù)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python+mysql實(shí)現(xiàn)教務(wù)管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02
在pytorch中實(shí)現(xiàn)只讓指定變量向后傳播梯度
今天小編就為大家分享一篇在pytorch中實(shí)現(xiàn)只讓指定變量向后傳播梯度,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02
pytorch 如何使用batch訓(xùn)練lstm網(wǎng)絡(luò)
這篇文章主要介紹了pytorch 如何使用batch訓(xùn)練lstm網(wǎng)絡(luò)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05
最基礎(chǔ)的Python的socket編程入門(mén)教程
這篇文章主要介紹了最基礎(chǔ)的Python的socket編程入門(mén)教程,包括最基本的發(fā)送和接受信息等內(nèi)容,需要的朋友可以參考下2015-04-04

