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

Python?異之如何同時(shí)運(yùn)行多個(gè)協(xié)程詳解

 更新時(shí)間:2023年03月22日 14:12:06   作者:冷凍工廠  
這篇文章主要為大家介紹了Python?異之如何同時(shí)運(yùn)行多個(gè)協(xié)程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

正文

asyncio 的一個(gè)好處是我們可以同時(shí)運(yùn)行許多協(xié)程。這些協(xié)同程序可以在一個(gè)組中創(chuàng)建并存儲(chǔ),然后同時(shí)一起執(zhí)行。這可以使用 asyncio.gather() 函數(shù)來(lái)實(shí)現(xiàn)。

讓我們仔細(xì)看看。

1. 什么是 Asyncio gather()

asyncio.gather() 模塊函數(shù)允許調(diào)用者將多個(gè)可等待對(duì)象組合在一起。分組后,可等待對(duì)象可以并發(fā)執(zhí)行、等待和取消。

它是一個(gè)有用的實(shí)用函數(shù),可用于分組和執(zhí)行多個(gè)協(xié)程或多個(gè)任務(wù)。

...
# run a collection of awaitables
results = await asyncio.gather(coro1(), asyncio.create_task(coro2()))

在我們可能預(yù)先創(chuàng)建許多任務(wù)或協(xié)程然后希望一次執(zhí)行它們并等待它們?nèi)客瓿珊笤倮^續(xù)的情況下,我們可以使用 asyncio.gather() 函數(shù)。

這是一種可能的情況,其中需要許多類(lèi)似任務(wù)的結(jié)果,例如具有不同數(shù)據(jù)的相同任務(wù)或協(xié)程。

可等待對(duì)象可以并發(fā)執(zhí)行,返回結(jié)果,并且主程序可以通過(guò)使用它所依賴(lài)的結(jié)果來(lái)恢復(fù)。

gather() 函數(shù)比簡(jiǎn)單地等待任務(wù)完成更強(qiáng)大。它允許將一組可等待對(duì)象視為單個(gè)可等待對(duì)象。

  • 通過(guò) await 表達(dá)式執(zhí)行并等待組中的所有可等待對(duì)象完成。
  • 從所有分組的等待對(duì)象中獲取結(jié)果,稍后通過(guò) result() 方法檢索。
  • 要通過(guò) cancel() 方法取消的一組等待對(duì)象。
  • 通過(guò) done() 方法檢查組中的所有可等待對(duì)象是否已完成。
  • 僅當(dāng)組中的所有任務(wù)完成時(shí)才執(zhí)行回調(diào)函數(shù)。

2. 如何使用 Asyncio gather()

在本節(jié)中,我們將仔細(xì)研究如何使用 asyncio.gather() 函數(shù)。

asyncio.gather() 函數(shù)將一個(gè)或多個(gè)可等待對(duì)象作為參數(shù)?;叵胍幌拢傻却龑?duì)象可能是協(xié)程、Future 或 Task。

因此,我們可以調(diào)用 gather() 函數(shù):

  • 多項(xiàng)任務(wù)
  • 多個(gè)協(xié)程
  • 任務(wù)和協(xié)程的混合
...
# execute multiple coroutines
asyncio.gather(coro1(), coro2())

如果 Task 對(duì)象被提供給 gather(),它們將已經(jīng)在運(yùn)行,因?yàn)?Tasks 被安排為創(chuàng)建的一部分。asyncio.gather() 函數(shù)將可等待對(duì)象作為位置參數(shù)。

我們不能創(chuàng)建可等待對(duì)象的列表或集合并將其提供給收集,因?yàn)檫@會(huì)導(dǎo)致錯(cuò)誤。

...
# cannot provide a list of awaitables directly
asyncio.gather([coro1(), coro2()])

如果首先使用星號(hào)運(yùn)算符 (*) 將其解壓縮到單獨(dú)的表達(dá)式中,則可以提供等待列表。

...
# gather with an unpacked list of awaitables
asyncio.gather(*[coro1(), coro2()])

如果協(xié)程提供給 gather(),它們會(huì)自動(dòng)包裝在 Task 對(duì)象中。gather() 函數(shù)不會(huì)阻塞。

相反,它返回一個(gè)代表可等待對(duì)象組的 asyncio.Future 對(duì)象。

...
# get a future that represents multiple awaitables
group = asyncio.gather(coro1(), coro2())

一旦創(chuàng)建了 Future 對(duì)象,它就會(huì)在事件循環(huán)中自動(dòng)調(diào)度。awaitable 代表組,組中的所有 awaitable 都會(huì)盡快執(zhí)行。這意味著如果調(diào)用者什么都不做,那么預(yù)定的可等待對(duì)象組將運(yùn)行(假設(shè)調(diào)用者掛起)。

這也意味著您不必等待從 gather() 返回的 Future。

...
# get a future that represents multiple awaitables
group = asyncio.gather(coro1(), coro2())
# suspend and wait a while, the group may be executing..
await asyncio.sleep(10)

可以等待返回的 Future 對(duì)象,它將等待組中的所有可等待對(duì)象完成。

...
# run the group of awaitables
await group

等待從 gather() 返回的 Future 將返回可等待對(duì)象的返回值列表。

如果可等待對(duì)象沒(méi)有返回值,則此列表將包含默認(rèn)的“無(wú)”返回值。

...
# run the group of awaitables and get return values
results = await group

這通常在一行中執(zhí)行。

...
# run tasks and get results on one line
results = await asyncio.gather(coro1(), coro2())

3. 列表中多個(gè)協(xié)程的 gather() 示例

預(yù)先創(chuàng)建多個(gè)協(xié)程然后再收集它們是很常見(jiàn)的。這允許程序準(zhǔn)備要并發(fā)執(zhí)行的任務(wù),然后立即觸發(fā)它們的并發(fā)執(zhí)行并等待它們完成。

我們可以手動(dòng)或使用列表理解將許多協(xié)程收集到一個(gè)列表中。

...
# create many coroutines
coros = [task_coro(i) for i in range(10)]

然后我們可以用列表中的所有協(xié)程調(diào)用 gather()。協(xié)程列表不能直接提供給 gather() 函數(shù),因?yàn)檫@會(huì)導(dǎo)致錯(cuò)誤。相反,gather() 函數(shù)要求將每個(gè)可等待對(duì)象作為單獨(dú)的位置參數(shù)提供。

這可以通過(guò)將列表展開(kāi)為單獨(dú)的表達(dá)式并將它們傳遞給 gather() 函數(shù)來(lái)實(shí)現(xiàn)。星號(hào)運(yùn)算符 (*) 將為我們執(zhí)行此操作。

...
# run the tasks
await asyncio.gather(*coros)

將它們結(jié)合在一起,下面列出了使用 gather() 運(yùn)行預(yù)先準(zhǔn)備好的協(xié)程列表的完整示例。

# SuperFastPython.com
# example of gather for many coroutines in a list
import asyncio
# coroutine used for a task
async def task_coro(value):
    # report a message
    print(f'>task {value} executing')
    # sleep for a moment
    await asyncio.sleep(1)
# coroutine used for the entry point
async def main():
    # report a message
    print('main starting')
    # create many coroutines
    coros = [task_coro(i) for i in range(10)]
    # run the tasks
    await asyncio.gather(*coros)
    # report a message
    print('main done')
# start the asyncio program
asyncio.run(main())

運(yùn)行該示例會(huì)執(zhí)行 main() 協(xié)程作為程序的入口點(diǎn)。main() 協(xié)程然后使用列表理解創(chuàng)建一個(gè)包含 10 個(gè)協(xié)程對(duì)象的列表。然后將此列表提供給 gather() 函數(shù),并使用星號(hào)運(yùn)算符將其解壓縮為 10 個(gè)單獨(dú)的表達(dá)式。

然后 main() 協(xié)程等待從調(diào)用 gather() 返回的 Future 對(duì)象,暫停并等待所有調(diào)度的協(xié)程完成它們的執(zhí)行。協(xié)程會(huì)盡快運(yùn)行,報(bào)告它們獨(dú)特的消息并在終止前休眠。

只有在組中的所有協(xié)程都完成后,main() 協(xié)程才會(huì)恢復(fù)并報(bào)告其最終消息。這突出了我們?nèi)绾螠?zhǔn)備協(xié)程集合并將它們作為單獨(dú)的表達(dá)式提供給 gather() 函數(shù)。

main starting
>task 0 executing
>task 1 executing
>task 2 executing
>task 3 executing
>task 4 executing
>task 5 executing
>task 6 executing
>task 7 executing
>task 8 executing
>task 9 executing
main done

以上就是Python 異之如何同時(shí)運(yùn)行多個(gè)協(xié)程詳解的詳細(xì)內(nèi)容,更多關(guān)于Python 異步同時(shí)運(yùn)行多個(gè)協(xié)程的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python getopt模塊使用實(shí)例解析

    python getopt模塊使用實(shí)例解析

    這篇文章主要介紹了python getopt模塊使用實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Python新手學(xué)習(xí)raise用法

    Python新手學(xué)習(xí)raise用法

    在本篇文章里小編給大家分享的是一篇關(guān)于Python新手學(xué)習(xí)raise用法的相關(guān)知識(shí)點(diǎn),需要的朋友們可以參考下。
    2020-06-06
  • Python多版本安裝與Jupyter Lab使用方式

    Python多版本安裝與Jupyter Lab使用方式

    這篇文章主要介紹了Python多版本安裝與Jupyter Lab使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Python re正則表達(dá)式元字符分組()用法分享

    Python re正則表達(dá)式元字符分組()用法分享

    在本篇文章里小編給大家整理了關(guān)于Python re正則表達(dá)式元字符分組()的相關(guān)知識(shí)點(diǎn)實(shí)例,需要的朋友們可以學(xué)習(xí)下。
    2020-02-02
  • Python實(shí)現(xiàn)遞歸遍歷文件夾并刪除文件

    Python實(shí)現(xiàn)遞歸遍歷文件夾并刪除文件

    本文給大家匯總了3個(gè)Python實(shí)現(xiàn)遍歷文件夾并刪除的代碼,主要是給大家分享下這3種方法的實(shí)現(xiàn)思路,有需要的小伙伴可以參考下
    2016-04-04
  • python實(shí)現(xiàn)飛機(jī)大戰(zhàn)游戲(pygame版)

    python實(shí)現(xiàn)飛機(jī)大戰(zhàn)游戲(pygame版)

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)pygame版的飛機(jī)大戰(zhàn)游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • python實(shí)現(xiàn)根據(jù)給定坐標(biāo)點(diǎn)生成多邊形mask的例子

    python實(shí)現(xiàn)根據(jù)給定坐標(biāo)點(diǎn)生成多邊形mask的例子

    今天小編就為大家分享一篇python實(shí)現(xiàn)根據(jù)給定坐標(biāo)點(diǎn)生成多邊形mask的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-02-02
  • Python unittest基本使用方法代碼實(shí)例

    Python unittest基本使用方法代碼實(shí)例

    這篇文章主要介紹了Python unittest基本使用方法代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • PyQt5根據(jù)控件Id獲取控件對(duì)象的方法

    PyQt5根據(jù)控件Id獲取控件對(duì)象的方法

    今天小編就為大家分享一篇PyQt5根據(jù)控件Id獲取控件對(duì)象的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-06-06
  • python批量處理打開(kāi)多個(gè)文件

    python批量處理打開(kāi)多個(gè)文件

    這篇文章主要介紹了python批量處理打開(kāi)多個(gè)文件,文章圍繞主題的相關(guān)內(nèi)容展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-06-06

最新評(píng)論

莒南县| 霍城县| 紫金县| 偃师市| 永年县| 观塘区| 大厂| 平乡县| 民勤县| 勐海县| 秭归县| 麦盖提县| 二手房| 顺昌县| 沙坪坝区| 交口县| 水富县| 拜泉县| 揭阳市| 会理县| 斗六市| 沭阳县| 敖汉旗| 徐水县| 若羌县| 定兴县| 左贡县| 大埔县| 大荔县| 湘乡市| 平湖市| 新源县| 石门县| 红河县| 镇坪县| 罗甸县| 渝北区| 永康市| 山阳县| 东海县| 岚皋县|