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

python異步編程之a(chǎn)syncio高階API的使用詳解

 更新時(shí)間:2024年01月09日 14:00:19   作者:金色旭光  
asyncio中函數(shù)可以分為高階函數(shù)和低階函數(shù),通常開發(fā)中使用更多的是高階函數(shù),本文主要為大家介紹了asyncio中常用的高階函數(shù),需要的可以參考下

1.asyncio 高階API列表

asyncio中函數(shù)可以分為高階函數(shù)和低階函數(shù)。低階函數(shù)用于調(diào)用事件循環(huán)、linux 套接字、信號(hào)等更底層的功能,高階函數(shù)是屏蔽了更多底層細(xì)節(jié)的任務(wù)并發(fā),任務(wù)執(zhí)行函數(shù)。通常開發(fā)中使用更多的是高階函數(shù)。本篇主要介紹asyncio中常用的高階函數(shù)。

由于asyncio在不同的版本中有差異,本文以及本系列都以python3.10為準(zhǔn)。

函數(shù)功能
run()創(chuàng)建事件循環(huán),運(yùn)行一個(gè)協(xié)程,關(guān)閉事件循環(huán)。
create_task()創(chuàng)建一個(gè)asyncio的Task對象
await sleep()休眠幾秒
await gather()并發(fā)執(zhí)行所有事件的調(diào)度和等待
await wait_for()有超時(shí)控制的運(yùn)行
await shield()屏蔽取消操作
await wait()完成情況的監(jiān)控器
current_task()返回當(dāng)前Task對象
all_tasks()返回事件循環(huán)中所有的task對象
TaskTask對象
to_thread()在不同的 OS 線程中異步地運(yùn)行一個(gè)函數(shù)
run_coroutine_threadsafe()從其他OS線程中調(diào)度一個(gè)協(xié)程
for in as_completed()用 for 循環(huán)監(jiān)控完成情況

2.run

函數(shù)原型:

asyncio.run(coro, *, debug=False)

功能:創(chuàng)建事件循環(huán),運(yùn)行傳入的協(xié)程。該函數(shù)總是會(huì)創(chuàng)建一個(gè)新的事件循環(huán)并在結(jié)束時(shí)關(guān)閉它,應(yīng)該被當(dāng)做asyncio程序的主入口點(diǎn)。run() 函數(shù)是用來創(chuàng)建事件,將task加入事件,運(yùn)行事件的函數(shù)。

async def main():
    await asyncio.sleep(1)
    print('hello')

asyncio.run(main())

run() 從功能上等價(jià)于以下低階API。獲取一個(gè)事件循環(huán),創(chuàng)建一個(gè)task,加入事件循環(huán)。

loop = asyncio.get_event_loop()
task = loop.create_task(main())
loop.run_until_complete(task)

3.create_task

函數(shù)原型:

asyncio.create_task(coro, *, name=None)

功能:將協(xié)程函數(shù)封裝成一個(gè)Task。協(xié)程函數(shù)沒有生命周期,但是Task有生命周期。

將協(xié)程打包為一個(gè) Task 并自動(dòng)尋找事件循環(huán)加入。返回 Task 對象。該任務(wù)會(huì)在 get_running_loop() 返回的循環(huán)中執(zhí)行,如果當(dāng)前線程沒有在運(yùn)行的循環(huán)則會(huì)引發(fā) RuntimeError。

async def coro():
    await asyncio.sleep(1)
    print("i am coro")


async def main():
    task = asyncio.create_task(coro())
    print(f"task狀態(tài):{task._state}")
    await asyncio.sleep(2)
    print(f"task狀態(tài):{task._state}")
    print("i am main")

asyncio.run(main())

結(jié)果:

task狀態(tài):PENDING
i am coro task
狀態(tài):FINISHED
i am main

結(jié)果分析:

可以看到task運(yùn)行中的狀態(tài)和結(jié)束的生命周期狀態(tài)

4.gather

函數(shù)原型:

asyncio.gather(*aws, return_exceptions=False)

功能:

并發(fā)執(zhí)行所有可等待對象,收集任務(wù)結(jié)果,返回所有已經(jīng)完成的task的結(jié)果。結(jié)果將是一個(gè)由所有返回值組成的列表。結(jié)果值的順序與傳入的task的順序一致??傻却龑ο罂梢允菂f(xié)程和task。

如果序列中是協(xié)程而不是task,那么會(huì)將其自動(dòng)封裝成task加入事件循環(huán)。

import asyncio

async def coro(value):
    print(f"hello coro{value}")
    return f"coro{value}"

async def main():
    tasks = [coro(i) for i in range(5)]
    res = await asyncio.gather(*tasks)
    for i in res:
        print(i)

asyncio.run(main())

結(jié)果:

hello coro0
hello coro1
hello coro2
hello coro3
hello coro4
coro0
coro1
coro2
coro3
coro4

結(jié)果分析:

獲取了所有協(xié)程的返回值,并且返回的順序和任務(wù)的順序一致。

5.wait

函數(shù)原型:

asyncio.wait(aws, *, timeout=None, return_when=ALL_COMPLETED)

功能:

并發(fā)地運(yùn)行序列中的可等待對象,并進(jìn)入阻塞狀態(tài)直到滿足 return_when 所指定的條件。將task任務(wù)結(jié)果收集起來,返回兩個(gè) Task/Future 集合: (done, pending)。done是已經(jīng)完成的任務(wù),pending是未完成的任務(wù),未完成的原因可能是超時(shí)或return_when策略。

aws:

aws中保存的是task而不是協(xié)程,從3.8起不建議傳入?yún)f(xié)程,3.11將不再支持傳入?yún)f(xié)程。

timeout:

如指定 timeout (float 或 int 類型) 則它將被用于控制返回之前等待的最長秒數(shù)。

請注意此函數(shù)不會(huì)引發(fā) asyncio.TimeoutError。當(dāng)超時(shí)發(fā)生時(shí),未完成的 Future 或 Task 將不會(huì)繼續(xù)執(zhí)行,不會(huì)返回結(jié)果。

return_when:

return_when 指定此函數(shù)應(yīng)在何時(shí)返回。它必須為以下參數(shù)之一:

參數(shù)描述
FIRST_COMPLETED函數(shù)將在任意可等待對象結(jié)束或取消時(shí)返回。
FIRST_EXCEPTION函數(shù)將在任意可等待對象因引發(fā)異常而結(jié)束時(shí)返回。當(dāng)沒有引發(fā)任何異常時(shí)它就相當(dāng)于 ALL_COMPLETED。
ALL_COMPLETED函數(shù)將在所有可等待對象結(jié)束或取消時(shí)返回。

基礎(chǔ)使用示例:

import asyncio


async def coro(value):
    print(f"hello coro{value}")
    return f"coro{value}"

async def main():
    tasks = [asyncio.create_task(coro(i)) for i in range(5)]
    done, pending = await asyncio.wait(tasks)
    for i in done:
        print(i.result())

asyncio.run(main())

結(jié)果:

hello coro0
hello coro1
hello coro2
hello coro3
hello coro4
coro1
coro2
coro0
coro3
coro4

結(jié)果分析:

返回結(jié)果和執(zhí)行順序并不是一致的

指定超時(shí)時(shí)間:

import asyncio
from asyncio import FIRST_COMPLETED

async def coro(value):
    print(f"hello coro{value}")
    await asyncio.sleep(value)
    return f"coro{value}"

async def main():
    tasks = [asyncio.create_task(coro(i)) for i in range(5)]
    done, pending = await asyncio.wait(tasks, timeout=3)

    print("---------finish----------")
    for i in done:
        print(i.result())

    print("---------pending----------")
    for i in pending:
        print(i)

asyncio.run(main())

hello coro0
hello coro1
hello coro2
hello coro3
hello coro4
---------finish----------
coro1
coro2
coro0
---------pending----------
<Task pending name='Task-5' coro=<coro() running at /Users/ljk/Documents/code/daily_dev/async_demo/wait_demo.py:6> wait_for=<Future finished result=None>>
<Task pending name='Task-6' coro=<coro() running at /Users/ljk/Documents/code/daily_dev/async_demo/wait_demo.py:6> wait_for=<Future pending cb=[Task.task_wakeup()]>>

結(jié)果分析:

超時(shí)未完成的task會(huì)保存在pending中,未完成的task在超時(shí)之后不會(huì)繼續(xù)執(zhí)行,沒有返回結(jié)果。

return_when配置任意任務(wù)完成就返回:

import asyncio
from asyncio import FIRST_COMPLETED

async def coro(value):
    print(f"hello coro{value}")
    await asyncio.sleep(value)
    return f"coro{value}"

async def main():
    tasks = [asyncio.create_task(coro(i)) for i in range(5)]
    done, pending = await asyncio.wait(tasks, return_when=FIRST_COMPLETED)

    print("---------finish----------")
    for i in done:
        print(i.result())

    print("---------pending----------")
    for i in pending:
        print(i)

asyncio.run(main())

結(jié)果:

hello coro0
hello coro1
hello coro2
hello coro3
hello coro4
---------finish----------
coro0
---------pending----------
<Task pending name='Task-5' coro=<coro() running at /Users/ljk/Documents/code/daily_dev/async_demo/wait_demo.py:6> wait_for=<Future pending cb=[Task.task_wakeup()]>>
<Task pending name='Task-3' coro=<coro() running at /Users/ljk/Documents/code/daily_dev/async_demo/wait_demo.py:6> wait_for=<Future pending cb=[Task.task_wakeup()]>>
<Task pending name='Task-4' coro=<coro() running at /Users/ljk/Documents/code/daily_dev/async_demo/wait_demo.py:6> wait_for=<Future pending cb=[Task.task_wakeup()]>>
<Task pending name='Task-6' coro=<coro() running at /Users/ljk/Documents/code/daily_dev/async_demo/wait_demo.py:6> wait_for=<Future pending cb=[Task.task_wakeup()]>>

結(jié)果分析:

獲取到任意結(jié)果就返回,未完成的task保存在pending中。未完成的task在超時(shí)之后不會(huì)繼續(xù)執(zhí)行。

6.as_completed

函數(shù)原型:

asyncio.as_completed(aws, *, timeout=None)

說明:并發(fā)執(zhí)行aws中保存的可等待對象,返回一個(gè)協(xié)程的迭代器??梢詮牡髦腥〕鲎钕葓?zhí)行完成的task的結(jié)果。返回結(jié)果和執(zhí)行順序不一致。aws中可以是task或協(xié)程序列。

import asyncio


async def coro(value):
    print(f"hello coro{value}")
    return f"coro{value}"

async def main():
    tasks = [coro(i) for i in range(5)]
    for item in asyncio.as_completed(tasks):
        res = await item
        print(res)


asyncio.run(main())

結(jié)果:

hello coro2
hello coro3
hello coro4
hello coro1
hello coro0
coro2
coro3
coro4
coro1
coro0

結(jié)果分析:

所有任務(wù)都會(huì)執(zhí)行完成,沒有超時(shí)配置。返回順序和執(zhí)行順序無關(guān)。

7.gather、wait、as_completed 異同點(diǎn)小結(jié)

asyncio協(xié)程體系中可以實(shí)現(xiàn)創(chuàng)建多個(gè)任務(wù)并發(fā)執(zhí)行的函數(shù)有以下三個(gè):

  • asyncio.gather
  • asyncio.wait
  • asyncio.as_completed

不同之處比較:

特性/函數(shù)gatherwaitas_completed
入?yún)?/td>同時(shí)支持task和協(xié)程序列只支持task序列同時(shí)支持task和協(xié)程序列
獲取結(jié)果順序有序,和并發(fā)序列順序相同無序,和并發(fā)序列無關(guān)無序,和并發(fā)序列無關(guān)
返回返回結(jié)果列表,保存的是函數(shù)返回值。返回元組done、pending。元組中保存的是task,而非task 的函數(shù)返回值返回一個(gè)迭代器,從中可迭代出函數(shù)返回值。

8.wait for

函數(shù)原型:

asyncio.wait_for(aw, timeout)

功能:執(zhí)行單個(gè)可等待對象,指定 timeout 秒數(shù)后超時(shí)

等待可等待對象完成,指定timeout秒數(shù)后超時(shí)。和gather類似,可以自動(dòng)將協(xié)程轉(zhuǎn)化成任務(wù)加入循環(huán)。

timeout 可以為 None,也可以為 float 或 int 型數(shù)值表示的等待秒數(shù)。如果 timeout 為 None,則等待直到完成。
如果發(fā)生超時(shí),任務(wù)將取消并引發(fā) asyncio.TimeoutError。

async def coro():
    # 睡眠5s
    await asyncio.sleep(3600)
    print('finish!')

async def main():
    # Wait for at most 1 second
    try:
        await asyncio.wait_for(coro(), timeout=1.0)
    except asyncio.TimeoutError:
        print('timeout!')

asyncio.run(main())

結(jié)果:

timeout!

以上就是python異步編程之a(chǎn)syncio高階API的使用詳解的詳細(xì)內(nèi)容,更多關(guān)于python asyncio高階API的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 使用Python串口實(shí)時(shí)顯示數(shù)據(jù)并繪圖的例子

    使用Python串口實(shí)時(shí)顯示數(shù)據(jù)并繪圖的例子

    今天小編就為大家分享一篇使用Python串口實(shí)時(shí)顯示數(shù)據(jù)并繪圖的例子,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • pygame畫點(diǎn)線方法詳解

    pygame畫點(diǎn)線方法詳解

    這篇文章主要介紹了pygame畫點(diǎn)線的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-11-11
  • pandas string轉(zhuǎn)dataframe的方法

    pandas string轉(zhuǎn)dataframe的方法

    下面小編就為大家分享一篇pandas string轉(zhuǎn)dataframe的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • python小白學(xué)習(xí)包管理器pip安裝

    python小白學(xué)習(xí)包管理器pip安裝

    在本篇文章里小編給大家分享的是一篇python包管理器pip安裝的相關(guān)知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們參考下。
    2020-06-06
  • 使用Python正則表達(dá)式判斷中文和英文姓名的方法

    使用Python正則表達(dá)式判斷中文和英文姓名的方法

    本文詳細(xì)解析了中文和英文姓名的正則表達(dá)式驗(yàn)證方法,并提供了基礎(chǔ)和擴(kuò)展版本,解釋了每個(gè)部分的作用及完整含義,此外,文章還介紹了正則表達(dá)式的關(guān)鍵字符和常用方法,并提供了實(shí)際應(yīng)用建議和示例代碼,幫助讀者更好地理解和應(yīng)用正則表達(dá)式進(jìn)行姓名驗(yàn)證
    2026-04-04
  • python游戲?qū)崙?zhàn)項(xiàng)目之俄羅斯方塊的魅力

    python游戲?qū)崙?zhàn)項(xiàng)目之俄羅斯方塊的魅力

    遲早一定會(huì)掛掉的俄羅斯方塊,為什么至今仍是世界游戲之王?它是怎么編寫的?本文將給大家詳細(xì)的介紹,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值
    2021-09-09
  • python 解決Fatal error in launcher:錯(cuò)誤問題

    python 解決Fatal error in launcher:錯(cuò)誤問題

    這篇文章主要介紹了python 解決Fatal error in launcher:錯(cuò)誤問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • django之使用celery-把耗時(shí)程序放到celery里面執(zhí)行的方法

    django之使用celery-把耗時(shí)程序放到celery里面執(zhí)行的方法

    今天小編就為大家分享一篇django之使用celery-把耗時(shí)程序放到celery里面執(zhí)行的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Python 實(shí)現(xiàn)中值濾波、均值濾波的方法

    Python 實(shí)現(xiàn)中值濾波、均值濾波的方法

    今天小編就為大家分享一篇Python 實(shí)現(xiàn)中值濾波、均值濾波的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • Python圖片縮放cv2.resize()圖文詳解

    Python圖片縮放cv2.resize()圖文詳解

    這篇文章主要給大家介紹了關(guān)于Python圖片縮放cv2.resize()的相關(guān)資料, resize是opencv庫中的一個(gè)函數(shù),主要起到對圖片進(jìn)行縮放的作用,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-10-10

最新評論

溧阳市| 巢湖市| 阳高县| 河池市| 洛浦县| 罗城| 隆尧县| 康平县| 五台县| 比如县| 宜宾市| 泰和县| 卓资县| 金沙县| 扶绥县| 通城县| 荥经县| 尉氏县| 克拉玛依市| 丹江口市| 岳阳县| 杭锦后旗| 黑山县| 东城区| 石台县| 江川县| 辛集市| 五家渠市| 衡南县| 桐城市| 嘉定区| 绩溪县| 卓资县| 上饶县| 波密县| 河间市| 都安| 巨鹿县| 玉屏| 台北市| 山阴县|