Python 中的異步與同步深度解析(實(shí)踐記錄)
Python中的異步與同步:深度解析與實(shí)踐
在Python編程世界里,異步和同步的概念是理解程序執(zhí)行流程和性能優(yōu)化的關(guān)鍵。這篇文章將帶你深入了解它們的差異,以及阻塞和非阻塞的特性,同時(shí)通過實(shí)際代碼示例來加深理解。
異步與同步的定義
異步
異步意味著多任務(wù)處理,任務(wù)之間的執(zhí)行沒有嚴(yán)格的先后順序,甚至可以同時(shí)運(yùn)行。這就好比你一邊聽音樂,一邊瀏覽網(wǎng)頁,聽音樂和瀏覽網(wǎng)頁這兩個(gè)任務(wù)之間互不干擾,多條任務(wù)的執(zhí)行路徑同時(shí)存在,程序有多個(gè)“主線”并行處理任務(wù)。
同步
同步同樣是處理多任務(wù),但任務(wù)之間有嚴(yán)格的先后順序。只有前一個(gè)任務(wù)執(zhí)行完成,下一個(gè)任務(wù)才能開始。這類似于你排隊(duì)買東西,必須一個(gè)人買完,下一個(gè)人才能接著買,整個(gè)過程只有一條“主線”。
阻塞與非阻塞的概念
阻塞
從調(diào)用者的角度來看,如果在調(diào)用某個(gè)操作時(shí),程序被卡住,無法繼續(xù)向下執(zhí)行,必須等待該操作完成,這種情況就是阻塞。比如你打電話叫外賣,在等待外賣送達(dá)的這段時(shí)間里,你什么其他事都做不了,只能干等著,這就是“阻塞”狀態(tài)。
非阻塞
當(dāng)調(diào)用某個(gè)操作時(shí),程序不會(huì)被卡住,能夠繼續(xù)向下執(zhí)行,無需等待該操作完成,這就是非阻塞。還是以叫外賣為例,你下單后可以繼續(xù)做自己的事情,不用一直等著外賣,這就是“非阻塞”狀態(tài)。
同步阻塞與異步非阻塞示例
下面通過Python代碼來具體展示異步和同步的工作方式。這里我們使用multiprocessing
模塊中的Pool
來創(chuàng)建進(jìn)程池,實(shí)現(xiàn)多任務(wù)處理。
from multiprocessing import Pool import time import os def water(): """燒水""" print(f"子進(jìn)程 pid={os.getpid()}") for i in range(5): print("正在燒水中") time.sleep(0.5) return "水燒開了" def handle_water(message): """接收燒開水的信息""" print(f"進(jìn)程pid={os.getpid()} 收到了異步任務(wù)的結(jié)束信息: {message}") pool = Pool(3) print(f"主進(jìn)程 pid={os.getpid()}") for i in range(3): print("打游戲") time.sleep(0.5) # 回調(diào) pool.apply_async(water, callback=handle_water) # 異步添加任務(wù) for i in range(20): print("打游戲") time.sleep(0.5) pool.close() pool.join()
在這段代碼中:
- 首先創(chuàng)建了一個(gè)進(jìn)程池
Pool
,最大進(jìn)程數(shù)為3。 - 主進(jìn)程先執(zhí)行一段“打游戲”的操作,循環(huán)3次,每次間隔0.5秒。
- 然后使用
pool.apply_async
方法異步地添加water
任務(wù)到進(jìn)程池,并設(shè)置了回調(diào)函數(shù)handle_water
。water
任務(wù)模擬燒水過程,會(huì)打印當(dāng)前子進(jìn)程ID并每隔0.5秒輸出“正在燒水中”,完成后返回“水燒開了”。handle_water
函數(shù)用于接收water
任務(wù)完成后的信息并打印。 - 接著主進(jìn)程繼續(xù)執(zhí)行“打游戲”操作,循環(huán)20次,每次間隔0.5秒。這期間,
water
任務(wù)在后臺(tái)異步執(zhí)行。 - 最后,調(diào)用
pool.close()
關(guān)閉進(jìn)程池,不再接受新任務(wù),pool.join()
讓主進(jìn)程等待所有子進(jìn)程完成任務(wù)后再結(jié)束。
通過這個(gè)示例,可以清晰地看到異步任務(wù)在后臺(tái)執(zhí)行,不會(huì)阻塞主進(jìn)程的其他操作,體現(xiàn)了異步非阻塞的特性。如果將pool.apply_async
換成pool.apply
,那么就是同步阻塞的效果,water
任務(wù)執(zhí)行時(shí)會(huì)阻塞主進(jìn)程,直到任務(wù)完成才會(huì)繼續(xù)執(zhí)行后續(xù)代碼。
理解異步、同步、阻塞和非阻塞的概念,能幫助開發(fā)者根據(jù)實(shí)際需求優(yōu)化程序性能,合理利用系統(tǒng)資源,讓程序運(yùn)行得更加高效和靈活。無論是處理I/O密集型任務(wù),還是CPU密集型任務(wù),選擇合適的執(zhí)行方式都是關(guān)鍵。
到此這篇關(guān)于Python 中的異步與同步:解析與實(shí)踐的文章就介紹到這了,更多相關(guān)Python 異步與同步內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python 實(shí)現(xiàn)簡單的計(jì)算器(gui界面)
這篇文章主要介紹了python 如何實(shí)現(xiàn)簡單的計(jì)算器,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2020-11-11Python計(jì)算程序運(yùn)行時(shí)間的方法
這篇文章主要介紹了Python計(jì)算程序運(yùn)行時(shí)間的方法,分別記錄起始時(shí)間與結(jié)束時(shí)間,計(jì)算兩者之間的差值來獲得程序的運(yùn)行時(shí)間,需要的朋友可以參考下2014-12-12手把手教你用Python打造互動(dòng)式中秋節(jié)慶祝小程序
中秋節(jié)將至,本文提供了一個(gè)使用Python開發(fā)的中秋節(jié)慶祝小程序教程,通過簡單的步驟,您可以創(chuàng)建一個(gè)具有節(jié)日祝福、互動(dòng)式燈謎游戲和模擬中秋明月動(dòng)態(tài)背景的小程序,文章詳細(xì)介紹了程序的功能、實(shí)現(xiàn)步驟以及如何運(yùn)行程序,需要的朋友可以參考下2024-09-09Python+opencv+pyaudio實(shí)現(xiàn)帶聲音屏幕錄制
今天小編就為大家分享一篇Python+opencv+pyaudio實(shí)現(xiàn)帶聲音屏幕錄制,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12python實(shí)現(xiàn)DEM數(shù)據(jù)的陰影生成的方法
這篇文章主要介紹了python實(shí)現(xiàn)DEM數(shù)據(jù)的陰影生成的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07關(guān)于Python中浮點(diǎn)數(shù)精度處理的技巧總結(jié)
雙精度浮點(diǎn)數(shù)(double)是計(jì)算機(jī)使用的一種數(shù)據(jù)類型,使用 64 位(8字節(jié)) 來存儲(chǔ)一個(gè)浮點(diǎn)數(shù)。下面這篇文章主要給大家總結(jié)介紹了關(guān)于Python中浮點(diǎn)數(shù)精度處理的技巧,需要的朋友可以參考借鑒,下面來一起看看吧。2017-08-08Python實(shí)現(xiàn)圖片裁剪的兩種方式(Pillow和OpenCV)
這篇文章主要介紹了Python實(shí)現(xiàn)圖片裁剪的兩種方式(Pillow和OpenCV),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10淺談pytorch 模型 .pt, .pth, .pkl的區(qū)別及模型保存方式
這篇文章主要介紹了淺談pytorch 模型 .pt, .pth, .pkl的區(qū)別及模型保存方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05