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