亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python 中的異步與同步深度解析(實(shí)踐記錄)

 更新時(shí)間:2025年03月28日 16:22:36   作者:子墨將  
在Python編程世界里,異步和同步的概念是理解程序執(zhí)行流程和性能優(yōu)化的關(guān)鍵,這篇文章將帶你深入了解它們的差異,以及阻塞和非阻塞的特性,同時(shí)通過實(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_waterwater任務(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ì)算器(gui界面)

    這篇文章主要介紹了python 如何實(shí)現(xiàn)簡單的計(jì)算器,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-11-11
  • Python計(jì)算程序運(yùn)行時(shí)間的方法

    Python計(jì)算程序運(yùn)行時(shí)間的方法

    這篇文章主要介紹了Python計(jì)算程序運(yùn)行時(shí)間的方法,分別記錄起始時(shí)間與結(jié)束時(shí)間,計(jì)算兩者之間的差值來獲得程序的運(yùn)行時(shí)間,需要的朋友可以參考下
    2014-12-12
  • Python字符串格式化

    Python字符串格式化

    Python字符串格式化操作符(%)只適用于字符串類型,非常類似于C 語言里面的printf()函數(shù)的字符串格式化,甚至所用的符號(hào)都一樣,都用百分號(hào)(%),并且支持所有printf()式的格式化操作。
    2015-06-06
  • 手把手教你用Python打造互動(dòng)式中秋節(jié)慶祝小程序

    手把手教你用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-09
  • Python+opencv+pyaudio實(shí)現(xiàn)帶聲音屏幕錄制

    Python+opencv+pyaudio實(shí)現(xiàn)帶聲音屏幕錄制

    今天小編就為大家分享一篇Python+opencv+pyaudio實(shí)現(xiàn)帶聲音屏幕錄制,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • python實(shí)現(xiàn)DEM數(shù)據(jù)的陰影生成的方法

    python實(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é)

    關(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-08
  • Python實(shí)現(xiàn)圖片裁剪的兩種方式(Pillow和OpenCV)

    Python實(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ū)別及模型保存方式

    這篇文章主要介紹了淺談pytorch 模型 .pt, .pth, .pkl的區(qū)別及模型保存方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • Flask深入了解Jinja2引擎的用法

    Flask深入了解Jinja2引擎的用法

    Jinja2是基于python的模板引擎,功能比較類似于于PHP的smarty,J2ee的Freemarker和velocity。 它能完全支持unicode,并具有集成的沙箱執(zhí)行環(huán)境,應(yīng)用廣泛。jinja2使用BSD授權(quán)
    2022-07-07

最新評(píng)論