最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python異步編程之a(chǎn)wait與asyncio基本用法詳解

 更新時(shí)間:2025年08月18日 15:51:14   作者:大大小小聰明  
在Python中,await和asyncio是異步編程的核心工具,用于高效處理 I/O 密集型任務(wù)(如網(wǎng)絡(luò)請求、文件讀寫、數(shù)據(jù)庫操作等),接下來通過本文給大家介紹Python異步編程之a(chǎn)wait與asyncio基本用法詳解,感興趣的朋友跟隨小編一起看看吧

在 Python 中,awaitasyncio 是異步編程的核心工具,用于高效處理 I/O 密集型任務(wù)(如網(wǎng)絡(luò)請求、文件讀寫、數(shù)據(jù)庫操作等)。它們的核心思想是通過 協(xié)程(Coroutine)事件循環(huán)(Event Loop) 實(shí)現(xiàn)非阻塞并發(fā),避免線程切換的開銷。

一、核心概念

協(xié)程(Coroutine)
async def 定義的函數(shù),返回一個(gè)協(xié)程對象,可以通過 await 掛起執(zhí)行,讓出控制權(quán)。

async def my_coroutine():
    await asyncio.sleep(1)
    print("Done")

事件循環(huán)(Event Loop)
異步程序的核心調(diào)度器,負(fù)責(zé)執(zhí)行協(xié)程并在 I/O 操作時(shí)切換任務(wù)。

可等待對象(Awaitable)
包括協(xié)程、asyncio.Taskasyncio.Future。只有可等待對象才能被 await。

二、使用場景

  1. 高并發(fā)網(wǎng)絡(luò)請求
    如爬蟲、API 調(diào)用等需要同時(shí)處理大量連接的場景。
  2. Web 服務(wù)器
    如 FastAPI、Sanic 等異步框架處理 HTTP 請求。
  3. 數(shù)據(jù)庫操作
    異步驅(qū)動(dòng)(如 asyncpg、aiomysql)避免阻塞主線程。
  4. 實(shí)時(shí)通信
    WebSocket、聊天服務(wù)器等需要長連接的場景。

三、基本用法

1. 定義協(xié)程

async def fetch_data(url):
    # 模擬網(wǎng)絡(luò)請求
    await asyncio.sleep(1)
    return f"Data from {url}"

2. 運(yùn)行協(xié)程

async def main():
    result = await fetch_data("https://example.com")
    print(result)
# Python 3.7+ 推薦方式
asyncio.run(main())

3. 并發(fā)執(zhí)行多個(gè)任務(wù)

使用 asyncio.gather()asyncio.create_task()

async def main():
    # 同時(shí)執(zhí)行多個(gè)協(xié)程
    task1 = asyncio.create_task(fetch_data("url1"))
    task2 = asyncio.create_task(fetch_data("url2"))
    # 等待所有任務(wù)完成
    results = await asyncio.gather(task1, task2)
    print(results)

四、關(guān)鍵 API 詳解

  • asyncio.run(coro)
    • 啟動(dòng)事件循環(huán)并運(yùn)行協(xié)程(Python 3.7+)。
  • asyncio.create_task(coro)
    • 將協(xié)程包裝為 Task,加入事件循環(huán)并發(fā)執(zhí)行。
  • asyncio.gather(*coros)
    • 并發(fā)執(zhí)行多個(gè)協(xié)程,返回結(jié)果列表。
  • asyncio.sleep(delay)
    • 非阻塞等待(模擬 I/O 操作)。

五、高級用法

1. 控制并發(fā)量

使用信號量(Semaphore)限制同時(shí)運(yùn)行的任務(wù)數(shù):

async def limited_fetch(url, semaphore):
    async with semaphore:
        return await fetch_data(url)
async def main():
    semaphore = asyncio.Semaphore(5)  # 最大并發(fā)5
    tasks = [limited_fetch(url, semaphore) for url in urls]
    await asyncio.gather(*tasks)

2. 超時(shí)控制

async def fetch_with_timeout():
    try:
        async with asyncio.timeout(3):  # Python 3.11+
            await fetch_data("slow_url")
    except TimeoutError:
        print("Timeout!")

3. 回調(diào)與 Future

async def main():
    loop = asyncio.get_running_loop()
    future = loop.create_future()
    def callback():
        future.set_result("Done")
    loop.call_soon(callback)
    result = await future
    print(result)

六、常見錯(cuò)誤

忘記 await
協(xié)程不會(huì)被自動(dòng)執(zhí)行:

async def main():
    fetch_data("url")  # 錯(cuò)誤!沒有 await

阻塞主線程
在協(xié)程中調(diào)用同步代碼(如 time.sleep())會(huì)阻塞事件循環(huán):

async def bad_example():
    time.sleep(1)  # 錯(cuò)誤!應(yīng)使用 await asyncio.sleep(1)

濫用并發(fā)
異步不適合 CPU 密集型任務(wù),此時(shí)應(yīng)使用多進(jìn)程。

七、完整示例

import asyncio
async def download(url, delay):
    print(f"Start downloading {url}")
    await asyncio.sleep(delay)
    print(f"Finished {url}")
    return url
async def main():
    urls = [
        ("https://site1.com", 1),
        ("https://site2.com", 2),
        ("https://site3.com", 3),
    ]
    tasks = [asyncio.create_task(download(url, delay)) for url, delay in urls]
    results = await asyncio.gather(*tasks)
    print("All done:", results)
if __name__ == "__main__":
    asyncio.run(main())

輸出:

Start downloading https://site1.com
Start downloading https://site2.com
Start downloading https://site3.com
Finished https://site1.com
Finished https://site2.com
Finished https://site3.com
All done: ['https://site1.com', 'https://site2.com', 'https://site3.com']

八、總結(jié)

  • 適用場景:I/O 密集型任務(wù),如網(wǎng)絡(luò)、文件、數(shù)據(jù)庫操作。
  • 關(guān)鍵點(diǎn)
    • 使用 async def 定義協(xié)程,用 await 掛起阻塞操作。
    • 通過 asyncio.create_task()asyncio.gather() 實(shí)現(xiàn)并發(fā)。
    • 避免在協(xié)程中調(diào)用阻塞同步代碼。

通過合理使用 asyncio,可以在單線程內(nèi)高效處理成千上萬的并發(fā)連接。

到此這篇關(guān)于Python異步編程之a(chǎn)wait與asyncio基本用法詳解的文章就介紹到這了,更多相關(guān)Python await與asyncio內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • PyQt5入門之基于QListWidget版本實(shí)現(xiàn)圖片縮略圖列表功能

    PyQt5入門之基于QListWidget版本實(shí)現(xiàn)圖片縮略圖列表功能

    這篇文章主要介紹了PyQt5入門之基于QListWidget版本實(shí)現(xiàn)圖片縮略圖列表功能,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • python開發(fā)一個(gè)解析protobuf文件的簡單編譯器

    python開發(fā)一個(gè)解析protobuf文件的簡單編譯器

    這篇文章主要介紹了python如何開發(fā)一個(gè)解析protobuf文件的簡單編譯器,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下
    2020-11-11
  • python數(shù)字圖像處理圖像的繪制詳解

    python數(shù)字圖像處理圖像的繪制詳解

    這篇文章主要為大家介紹了python數(shù)字圖像處理圖像的繪制示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Python中全局變量和局部變量的區(qū)別以及使用

    Python中全局變量和局部變量的區(qū)別以及使用

    本文介紹了Python中的變量作用域,包括局部變量和全局變量的定義使用和區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-11-11
  • Python基本數(shù)據(jù)類型和打印的操作指南

    Python基本數(shù)據(jù)類型和打印的操作指南

    Python是一種簡潔易讀的編程語言,擁有豐富的內(nèi)置數(shù)據(jù)類型,掌握基本數(shù)據(jù)類型和打印輸出是學(xué)習(xí)Python的第一步,也是編程的基礎(chǔ)技能,本文小編為大家詳細(xì)說說
    2026-02-02
  • python中使用xlrd讀excel使用xlwt寫excel的實(shí)例代碼

    python中使用xlrd讀excel使用xlwt寫excel的實(shí)例代碼

    這篇文章主要介紹了python中使用xlrd讀excel使用xlwt寫excel的實(shí)例代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • pytorch加載自己的圖片數(shù)據(jù)集的2種方法詳解

    pytorch加載自己的圖片數(shù)據(jù)集的2種方法詳解

    數(shù)據(jù)預(yù)處理在解決深度學(xué)習(xí)問題的過程中,往往需要花費(fèi)大量的時(shí)間和精力,下面這篇文章主要給大家介紹了關(guān)于pytorch加載自己的圖片數(shù)據(jù)集的2種方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • Python enumerate函數(shù)功能與用法示例

    Python enumerate函數(shù)功能與用法示例

    這篇文章主要介紹了Python enumerate函數(shù)功能與用法,結(jié)合實(shí)例形式分析了enumerate函數(shù)針對列表、字符串遍歷操作相關(guān)使用技巧,需要的朋友可以參考下
    2019-03-03
  • Python讀取表格類型文件代碼實(shí)例

    Python讀取表格類型文件代碼實(shí)例

    這篇文章主要介紹了Python讀取表格類型文件代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • python用Configobj模塊讀取配置文件

    python用Configobj模塊讀取配置文件

    這篇文章主要介紹了python用Configobj模塊讀取配置文件,幫助大家更好的利用python處理文件,感興趣的朋友可以了解下
    2020-09-09

最新評論

明溪县| 中卫市| 和田市| 武城县| 定陶县| 田东县| 察隅县| 三都| 平阳县| 盘山县| 连山| 东光县| 道真| 荥经县| 永吉县| 灵石县| 吴忠市| 英德市| 福建省| 甘泉县| 阳谷县| 丘北县| 明溪县| 牟定县| 祁门县| 腾冲县| 张家港市| 秀山| 涡阳县| 永城市| 古丈县| 武胜县| 甘洛县| 泸水县| 大方县| 拉孜县| 乌鲁木齐市| 东阳市| 固镇县| 永嘉县| 临邑县|