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

Python中asyncio的多種用法舉例(異步同步)

 更新時(shí)間:2024年11月13日 09:47:49   作者:碼農(nóng)葫蘆俠  
這篇文章主要給大家介紹了關(guān)于Python中asyncio的多種用法,包括順序執(zhí)行非異步任務(wù)、順序執(zhí)行異步任務(wù)、并行執(zhí)行異步任務(wù)以及并行執(zhí)行非異步任務(wù),通過(guò)使用asyncio模塊,可以有效地提高程序的執(zhí)行效率,尤其是在處理I/O密集型任務(wù)時(shí),需要的朋友可以參考下

1 引言 

Python 的 asyncio 模塊為異步編程提供了強(qiáng)大的支持,但在某些場(chǎng)景下,我們可能需要處理異步任務(wù)與非異步(同步)任務(wù)的順序執(zhí)行或并行執(zhí)行。本篇文章將逐步帶你了解如何在 Python 中處理這些不同類(lèi)型的任務(wù)。

2 順序執(zhí)行非異步任務(wù) 

在日常編程中,最常見(jiàn)的情況之一就是順序執(zhí)行一系列非異步(同步)的任務(wù)。這些任務(wù)在同一個(gè)線程中執(zhí)行,通常會(huì)阻塞主程序的運(yùn)行,直到任務(wù)完成。

示例代碼:

import time

def blocking_task(id):
    print(f"Blocking task {id} started")
    time.sleep(2)  # 模擬一個(gè)阻塞操作
    print(f"Blocking task {id} finished")

# 順序執(zhí)行多個(gè)同步任務(wù)
def main():
    for i in range(3):
        blocking_task(i)

main()

解釋:

在此代碼中,每個(gè)任務(wù)按順序執(zhí)行,time.sleep() 會(huì)阻塞當(dāng)前線程,直到所有任務(wù)結(jié)束。這種順序執(zhí)行的方式雖然簡(jiǎn)單直接,但效率較低,尤其當(dāng)任務(wù)涉及 I/O 操作時(shí),會(huì)浪費(fèi)大量時(shí)間。

3 順序執(zhí)行異步任務(wù)

如果我們希望提高任務(wù)的執(zhí)行效率,可以考慮使用異步任務(wù)。異步任務(wù)不會(huì)阻塞主線程,而是會(huì)等待特定的事件(例如 I/O 操作的完成),然后繼續(xù)執(zhí)行。

示例代碼:

import asyncio

async def async_task(id):
    print(f"Async task {id} started")
    await asyncio.sleep(2)  # 模擬異步操作
    print(f"Async task {id} finished")

# 順序執(zhí)行多個(gè)異步任務(wù)
async def main():
    for i in range(3):
        await async_task(i)

asyncio.run(main())

解釋?zhuān)?/strong>

通過(guò)使用 async def 定義異步函數(shù),await 關(guān)鍵字用于暫停任務(wù)的執(zhí)行并等待異步操作完成。雖然這些任務(wù)是異步的,但由于我們使用了 await,它們?nèi)匀皇琼樞驁?zhí)行的。

3 并行執(zhí)行異步任務(wù)

在某些情況下,我們可能希望異步任務(wù)能夠并行執(zhí)行,而不是一個(gè)接一個(gè)地等待。此時(shí)可以使用 asyncio.gather(),它允許我們并行運(yùn)行多個(gè)異步任務(wù),從而提高程序效率。

示意圖:

示例代碼:

import asyncio

async def async_task(id):
    print(f"Async task {id} started")
    await asyncio.sleep(2)
    print(f"Async task {id} finished")

# 并行執(zhí)行多個(gè)異步任務(wù)
async def main():
    tasks = [async_task(i) for i in range(3)]
    await asyncio.gather(*tasks)

asyncio.run(main())

解釋?zhuān)?/strong>

asyncio.gather() 會(huì)并行執(zhí)行多個(gè)異步任務(wù),而不是按順序等待。任務(wù)在后臺(tái)同時(shí)運(yùn)行,極大提高了效率,尤其是當(dāng)任務(wù)需要等待 I/O 時(shí)(例如網(wǎng)絡(luò)請(qǐng)求、文件操作等)。

? 注意:

tasks = [async_task(i) for i in range(3)] 這個(gè)時(shí)候不會(huì)執(zhí)行async_task函數(shù),只是創(chuàng)建協(xié)程對(duì)象,還沒(méi)真正的啟動(dòng)。

  • 當(dāng)你調(diào)用 async_task(i) 時(shí),它不會(huì)立即執(zhí)行,而是返回一個(gè) 協(xié)程對(duì)象(coroutine object),這個(gè)對(duì)象代表一個(gè)等待執(zhí)行的異步任務(wù)。
  • 只有當(dāng)你 await 這個(gè)協(xié)程對(duì)象或者將它傳遞給 asyncio.gather()、asyncio.create_task()、asyncio.run() 等函數(shù)時(shí),協(xié)程才會(huì)開(kāi)始執(zhí)行。

4 并行執(zhí)行非異步任務(wù)(阻塞任務(wù))

如果你有一些外部庫(kù)提供的阻塞任務(wù)(如文件讀寫(xiě)、網(wǎng)絡(luò)操作等),這些任務(wù)無(wú)法直接變?yōu)楫惒胶瘮?shù)。為了與異步任務(wù)并行執(zhí)行這些阻塞任務(wù),asyncio.run_in_executor() 是你的好幫手。

示意圖:

示例代碼:使用線程池并行執(zhí)行同步任務(wù)

import asyncio
import time
from concurrent.futures import ThreadPoolExecutor

def blocking_task(id):
    print(f"Blocking task {id} started")
    time.sleep(2)
    print(f"Blocking task {id} finished")

async def main():
    with ThreadPoolExecutor() as pool:
        tasks = [
            asyncio.get_event_loop().run_in_executor(pool, blocking_task, i)
            for i in range(3)
        ]
        await asyncio.gather(*tasks)

asyncio.run(main())

解釋?zhuān)?/strong>

run_in_executor() 將阻塞的任務(wù)交給線程池(或進(jìn)程池)執(zhí)行,而不會(huì)阻塞主事件循環(huán)。這使得我們可以同時(shí)處理異步任務(wù)和阻塞任務(wù)。

使用進(jìn)程池還是線程池?

  • 線程池(ThreadPoolExecutor):適用于 I/O 密集型任務(wù),如文件操作或網(wǎng)絡(luò)請(qǐng)求。這類(lèi)任務(wù)通常會(huì)等待外部事件完成,因此不需要消耗大量 CPU 資源。
  • 進(jìn)程池(ProcessPoolExecutor):適合 CPU 密集型任務(wù),如數(shù)據(jù)處理和計(jì)算。使用進(jìn)程池可以充分利用多核 CPU,提升性能。

示例代碼:使用進(jìn)程池

from concurrent.futures import ProcessPoolExecutor
import asyncio

def cpu_intensive_task(id):
    print(f"CPU task {id} started")
    result = sum(i*i for i in range(10**6))  # 模擬CPU密集任務(wù)
    print(f"CPU task {id} finished with result: {result}")

async def main():
    with ProcessPoolExecutor() as pool:
        tasks = [
            asyncio.get_event_loop().run_in_executor(pool, cpu_intensive_task, i)
            for i in range(3)
        ]
        await asyncio.gather(*tasks)

asyncio.run(main())

5 總結(jié)

  • 順序執(zhí)行非異步任務(wù):通常用于簡(jiǎn)單的任務(wù),但效率低下,容易阻塞線程。
  • 順序執(zhí)行異步任務(wù):使用 asyncio 提供的異步函數(shù),能夠在等待 I/O 時(shí)不阻塞主線程。
  • 并行執(zhí)行異步任務(wù):通過(guò) asyncio.gather(),可以輕松并行多個(gè)異步任務(wù),極大提高執(zhí)行效率。
  • 并行執(zhí)行非異步任務(wù):通過(guò) run_in_executor() 將阻塞任務(wù)交給線程池或進(jìn)程池,保證異步任務(wù)和同步任務(wù)可以并行執(zhí)行。
  • 線程池 vs 進(jìn)程池:選擇線程池處理 I/O 密集型任務(wù),進(jìn)程池處理 CPU 密集型任務(wù)。

通過(guò)這些技巧,你可以在 Python 中輕松管理各種類(lèi)型的任務(wù),實(shí)現(xiàn)高效并行處理。

到此這篇關(guān)于Python中asyncio的多種用法的文章就介紹到這了,更多相關(guān)Python中asyncio多種用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python中實(shí)現(xiàn)變量賦值傳遞時(shí)的引用和拷貝方法

    Python中實(shí)現(xiàn)變量賦值傳遞時(shí)的引用和拷貝方法

    下面小編就為大家分享一篇Python中實(shí)現(xiàn)變量賦值傳遞時(shí)的引用和拷貝方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • 值得收藏,Python 開(kāi)發(fā)中的高級(jí)技巧

    值得收藏,Python 開(kāi)發(fā)中的高級(jí)技巧

    這篇文章主要介紹了Python 開(kāi)發(fā)中的高級(jí)技巧,非常不錯(cuò),具有收藏價(jià)值,感興趣的朋友一起看看吧
    2018-11-11
  • 利用Python實(shí)現(xiàn)給圖像添加標(biāo)簽

    利用Python實(shí)現(xiàn)給圖像添加標(biāo)簽

    這篇文章主要為大家詳細(xì)介紹了如何利用Python實(shí)現(xiàn)給指定的圖片添加標(biāo)簽,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,需要的可以參考一下
    2023-07-07
  • python中ndarray數(shù)組的索引和切片的使用

    python中ndarray數(shù)組的索引和切片的使用

    本文主要介紹了python中ndarray數(shù)組的索引和切片的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 詳解Python如何利用petl做數(shù)據(jù)遷移

    詳解Python如何利用petl做數(shù)據(jù)遷移

    隨著數(shù)據(jù)量的不斷增長(zhǎng),數(shù)據(jù)遷移成為了一項(xiàng)必不可少的任務(wù),本文就來(lái)為大家詳細(xì)介紹一下如何使用PETL進(jìn)行數(shù)據(jù)遷移,并給出一些實(shí)踐案例,需要的可以參考下
    2024-01-01
  • 如何使用python爬取csdn博客訪問(wèn)量

    如何使用python爬取csdn博客訪問(wèn)量

    這篇文章主要介紹了如何使用python爬取csdn博客訪問(wèn)量的相關(guān)資料,需要的朋友可以參考下
    2016-02-02
  • 深度學(xué)習(xí)環(huán)境配置之Anaconda安裝和pip源方式

    深度學(xué)習(xí)環(huán)境配置之Anaconda安裝和pip源方式

    這篇文章主要介紹了深度學(xué)習(xí)環(huán)境配置之Anaconda安裝和pip源方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Python中實(shí)現(xiàn)文本糾錯(cuò)的多種方法

    Python中實(shí)現(xiàn)文本糾錯(cuò)的多種方法

    本文介紹了Python中實(shí)現(xiàn)文本糾錯(cuò)的多種方法,從基礎(chǔ)規(guī)則到深度學(xué)習(xí)的全技術(shù)棧,涵蓋正則表達(dá)式、字典匹配、PyEnchant、TextBlob、LanguageTool等專(zhuān)用校對(duì)庫(kù),以及基于BERT、T5/BART的深度學(xué)習(xí)模型,需要的朋友可以參考下
    2026-04-04
  • python中如何使用正則表達(dá)式的非貪婪模式示例

    python中如何使用正則表達(dá)式的非貪婪模式示例

    貪婪與非貪婪模式影響的是被量詞修飾的子表達(dá)式的匹配行為,下面這篇文章主要給大家介紹了關(guān)于python中如何使用正則表達(dá)式的非貪婪模式的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-10-10
  • django自帶serializers序列化返回指定字段的方法

    django自帶serializers序列化返回指定字段的方法

    今天小編就為大家分享一篇django自帶serializers序列化返回指定字段的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-08-08

最新評(píng)論

定日县| 班玛县| 淮北市| 财经| 宜州市| 台中市| 维西| 南和县| 乳山市| 中西区| 灌南县| 大连市| 读书| 望谟县| 武夷山市| 边坝县| 寿光市| 杨浦区| 湟源县| 虞城县| 松滋市| 沙洋县| 城口县| 洪洞县| 荔浦县| 信丰县| 米脂县| 改则县| 昌平区| 拉萨市| 康平县| 华阴市| 广昌县| 汕尾市| 宁都县| 秭归县| 双峰县| 沈阳市| 三门县| 安徽省| 梅河口市|