欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python使用異步編程提升程序性能詳解

 更新時(shí)間:2025年04月05日 09:52:48   作者:真智AI  
這篇文章主要介紹了Python使用異步編程提升程序性能,異步編程是一種強(qiáng)大的技術(shù),可以顯著提升應(yīng)用程序的性能,它允許你在不需要手動管理線程或進(jìn)程的情況下,同時(shí)執(zhí)行多個(gè)任務(wù),需要的朋友可以參考下

異步編程-提升應(yīng)用性能的強(qiáng)大技術(shù)

異步編程是一種強(qiáng)大的技術(shù),可以顯著提升應(yīng)用程序的性能。它允許你在不需要手動管理線程或進(jìn)程的情況下,同時(shí)執(zhí)行多個(gè)任務(wù)。這種方法特別適用于需要進(jìn)行 API 請求、文件讀取或數(shù)據(jù)庫交互的開發(fā)者,而且不會暫停整個(gè)應(yīng)用程序的運(yùn)行。

在 Python 中,最知名的異步編程庫是 asyncio。這個(gè)庫通過實(shí)現(xiàn)事件循環(huán)(Event Loop)、協(xié)程(Coroutines)和非阻塞 I/O(Non-blocking I/O)來管理程序的執(zhí)行。如果你希望構(gòu)建高響應(yīng)性和高可擴(kuò)展性的應(yīng)用程序,強(qiáng)烈建議你深入研究這個(gè)庫。

同步vs異步編程

在同步編程中,任務(wù)是按順序執(zhí)行的,意味著每個(gè)任務(wù)必須在前一個(gè)任務(wù)完成后才能開始。如下圖所示,程序會等待一個(gè)任務(wù)執(zhí)行完畢后再進(jìn)行下一個(gè)任務(wù)。

(同步執(zhí)行示意圖)

相反,異步編程允許多個(gè)任務(wù)同時(shí)運(yùn)行。當(dāng)一個(gè)任務(wù)在等待某個(gè)慢操作(如從服務(wù)器獲取數(shù)據(jù))時(shí),程序可以繼續(xù)執(zhí)行其他任務(wù)。這種**“非阻塞”**方法避免了程序停滯,使可用資源得到更好的利用,從而顯著提高執(zhí)行效率。下圖展示了異步編程的工作方式。

(異步執(zhí)行示意圖)

什么是asyncio

asyncio 提供了一個(gè)框架,使開發(fā)者可以使用 asyncawait 語法編寫異步代碼。它允許程序在不停止其他進(jìn)程的情況下執(zhí)行網(wǎng)絡(luò)請求、文件訪問等操作。這樣,程序可以在等待某些任務(wù)完成時(shí)仍然保持響應(yīng)性。

值得注意的是,asyncio 從 Python 3.3 版本起就默認(rèn)包含,無需額外安裝。

asyncio的核心組件

  • 事件循環(huán)(Event Loop):管理和調(diào)度異步任務(wù)和協(xié)程的核心機(jī)制。
  • 協(xié)程(Coroutines):使用 async def 定義的特殊函數(shù),它們可以使用 await 關(guān)鍵字暫停執(zhí)行,以便讓其他任務(wù)運(yùn)行。
  • 任務(wù)(Tasks):已被調(diào)度到事件循環(huán)中的協(xié)程,可使用 asyncio.create_task() 創(chuàng)建任務(wù)。
  • Future 對象(Futures):表示可能尚未完成的操作的結(jié)果,相當(dāng)于未來可用的占位符。

asyncio的基本用法

import asyncio
async def calculate_square(number):
    print(f"開始計(jì)算 {number} 的平方")
    await asyncio.sleep(1)  # 模擬延遲
    print(f"{number} 的平方計(jì)算完成")
    return number ** 2
async def calculate_cube(number):
    print(f"開始計(jì)算 {number} 的立方")
    await asyncio.sleep(2)  # 模擬延遲
    print(f"{number} 的立方計(jì)算完成")
    return number ** 3
async def main():
    # 創(chuàng)建任務(wù)并調(diào)度到事件循環(huán)中
    task1 = asyncio.create_task(calculate_square(5))  
    task2 = asyncio.create_task(calculate_cube(3))   
    # 等待任務(wù)完成
    result1 = await task1
    result2 = await task2
    # 輸出結(jié)果
    print(f"平方結(jié)果:{result1}")  
    print(f"立方結(jié)果:{result2}")   
if __name__ == "__main__":
    # 啟動事件循環(huán)
    asyncio.run(main())

關(guān)鍵點(diǎn)解析

  • 事件循環(huán):asyncio.run(main()) 啟動事件循環(huán),并運(yùn)行 main() 協(xié)程。
  • 協(xié)程:calculate_square(number)calculate_cube(number) 是協(xié)程,它們使用 await asyncio.sleep() 模擬延遲,而不會阻塞整個(gè)程序。
  • 任務(wù):在 main() 中,我們使用 asyncio.create_task() 創(chuàng)建任務(wù),讓兩個(gè)協(xié)程并行運(yùn)行。
  • Future 對象:result1result2 是 Future 對象,代表 calculate_square()calculate_cube() 任務(wù)的最終結(jié)果。

運(yùn)行結(jié)果

開始計(jì)算 5 的平方
開始計(jì)算 3 的立方
5 的平方計(jì)算完成
3 的立方計(jì)算完成
平方結(jié)果:25
立方結(jié)果:27

運(yùn)行多個(gè)協(xié)程asyncio.gather()

asyncio.gather() 允許多個(gè)協(xié)程并行執(zhí)行,通常用于批量發(fā)送網(wǎng)絡(luò)請求。讓我們用一個(gè)示例來模擬多個(gè) HTTP 請求的并發(fā)執(zhí)行。

示例代碼

import asyncio
# 模擬從 URL 獲取數(shù)據(jù)的任務(wù)
async def fetch_data(URL, delay):
    print(f"開始從 {URL} 獲取數(shù)據(jù)")
    await asyncio.sleep(delay)  # 模擬網(wǎng)絡(luò)延遲
    return f"從 {URL} 獲取數(shù)據(jù)完成(耗時(shí) {delay} 秒)"
async def main():
    # 并行執(zhí)行多個(gè)獲取數(shù)據(jù)的任務(wù)
    results = await asyncio.gather(
        fetch_data("https://openai.com", 2),  
        fetch_data("https://github.com", 5),  
        fetch_data("https://python.org", 7)   
    )
    # 輸出所有任務(wù)的結(jié)果
    for result in results:
        print(result)
asyncio.run(main())

關(guān)鍵點(diǎn)解析

  • fetch_data(URL, delay) 模擬從 URL 獲取數(shù)據(jù),并設(shè)置不同的延遲時(shí)間。
  • asyncio.gather() 讓三個(gè) fetch_data() 協(xié)程并行執(zhí)行,而不會一個(gè)完成后再啟動下一個(gè)。
  • 任務(wù)并行運(yùn)行,因此程序不會等待一個(gè)任務(wù)完成后才開始下一個(gè),極大提升效率。

運(yùn)行結(jié)果

開始從 https://openai.com 獲取數(shù)據(jù)
開始從 https://github.com 獲取數(shù)據(jù)
開始從 https://python.org 獲取數(shù)據(jù)
從 https://openai.com 獲取數(shù)據(jù)完成(耗時(shí) 2 秒)
從 https://github.com 獲取數(shù)據(jù)完成(耗時(shí) 5 秒)
從 https://python.org 獲取數(shù)據(jù)完成(耗時(shí) 7 秒)

處理超時(shí)asyncio.wait_for()

asyncio.wait_for() 允許你為異步任務(wù)設(shè)置超時(shí)時(shí)間,如果任務(wù)超時(shí)未完成,將引發(fā) asyncio.TimeoutError。

示例代碼

import asyncio
async def fetch_data():
    await asyncio.sleep(15)  # 模擬網(wǎng)絡(luò)延遲
    return "數(shù)據(jù)獲取成功"
async def main():
    try:
        # 設(shè)置超時(shí)時(shí)間為 10 秒
        result = await asyncio.wait_for(fetch_data(), timeout=10) 
        print(result)
    except asyncio.TimeoutError:
        print("數(shù)據(jù)獲取超時(shí)")
asyncio.run(main())

如果 fetch_data() 任務(wù)執(zhí)行超過 10 秒,就會觸發(fā)超時(shí)異常 TimeoutError。

總結(jié)

本指南介紹了 Python 的 asyncio 庫,并對同步與異步編程區(qū)別、核心組件和代碼示例進(jìn)行了詳細(xì)講解。雖然編寫異步代碼可能會讓初學(xué)者感到困惑,但一旦熟練掌握,你會發(fā)現(xiàn)它能極大提升程序的性能和響應(yīng)速度。

如果你想深入了解 asyncio,建議查閱官方文檔

以上就是Python使用異步編程提升程序性能詳解的詳細(xì)內(nèi)容,更多關(guān)于Python異步編程的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python k-近鄰算法實(shí)例分享

    python k-近鄰算法實(shí)例分享

    這個(gè)算法主要工作是測量不同特征值之間的距離,有個(gè)這個(gè)距離,就可以進(jìn)行分類了。簡稱kNN。
    2014-06-06
  • python調(diào)用私有屬性的方法總結(jié)

    python調(diào)用私有屬性的方法總結(jié)

    在本篇文章里小編給大家整理的是一篇關(guān)于python調(diào)用私有屬性的方法總結(jié),對此有需要的朋友們可以學(xué)習(xí)下。
    2020-07-07
  • 輕松實(shí)現(xiàn)python搭建微信公眾平臺

    輕松實(shí)現(xiàn)python搭建微信公眾平臺

    這篇文章主要介紹了python搭建微信公眾平臺的相關(guān)資料和技巧,文中給出了詳細(xì)的python搭建微信公眾平臺的步驟,感興趣的朋友可以參考一下
    2016-02-02
  • 淺談編碼,解碼,亂碼的問題

    淺談編碼,解碼,亂碼的問題

    下面小編就為大家?guī)硪黄獪\談編碼,解碼,亂碼的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-12-12
  • python 同時(shí)讀取多個(gè)文件的例子

    python 同時(shí)讀取多個(gè)文件的例子

    今天小編就為大家分享一篇python 同時(shí)讀取多個(gè)文件的例子,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • python3爬蟲學(xué)習(xí)之?dāng)?shù)據(jù)存儲txt的案例詳解

    python3爬蟲學(xué)習(xí)之?dāng)?shù)據(jù)存儲txt的案例詳解

    這篇文章主要介紹了python3爬蟲學(xué)習(xí)之?dāng)?shù)據(jù)存儲txt的案例詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Python 生成器,迭代,yield關(guān)鍵字,send()傳參給yield語句操作示例

    Python 生成器,迭代,yield關(guān)鍵字,send()傳參給yield語句操作示例

    這篇文章主要介紹了Python 生成器,迭代,yield關(guān)鍵字,send()傳參給yield語句操作,結(jié)合實(shí)例形式分析了Python生成器、迭代、yield關(guān)鍵字及異常處理相關(guān)操作技巧,需要的朋友可以參考下
    2019-10-10
  • 分享3個(gè)非常實(shí)用的?Python?模塊

    分享3個(gè)非常實(shí)用的?Python?模塊

    這篇文章主要爹大家分享的是分享3個(gè)非常實(shí)用的?Python?模塊,知道的人可能不多,但是特別的好用,分別是Psutil、Pendulum、Pyfiglet三種模塊,需要的小伙伴可以參考下面相關(guān)內(nèi)容,希望對你有所幫助
    2022-03-03
  • 簡單了解python gevent 協(xié)程使用及作用

    簡單了解python gevent 協(xié)程使用及作用

    這篇文章主要介紹了簡單了解python gevent 協(xié)程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • Python3離線安裝第三方包的圖文教程

    Python3離線安裝第三方包的圖文教程

    因?yàn)樯婷軉挝换蛘邔Π踩蟊容^高的環(huán)境下,服務(wù)器無法連接互聯(lián)網(wǎng),所以這篇文章就來為大家詳細(xì)介紹一下Python3離線安裝第三方包具體方法吧
    2025-03-03

最新評論