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

如何使用Python異步之上下文管理器

 更新時(shí)間:2023年03月22日 11:15:29   作者:冷凍工廠  
這篇文章主要為大家介紹了如何使用Python異步之上下文管理器詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

正文

上下文管理器是一種 Python 構(gòu)造,它提供了一個(gè)類似 try-finally 的環(huán)境,具有一致的接口和方便的語(yǔ)法,例如通過(guò)“with”表達(dá)。

它通常與資源一起使用,確保在我們完成資源后始終關(guān)閉或釋放資源,無(wú)論資源的使用是成功還是因異常而失敗。

Asyncio 允許我們開(kāi)發(fā)異步上下文管理器。

我們可以通過(guò)定義一個(gè)將 aenter() 和 aexit() 方法實(shí)現(xiàn)為協(xié)程的對(duì)象來(lái)在 asyncio 程序中創(chuàng)建和使用異步上下文管理器。

1. 什么是異步上下文管理器

異步上下文管理器是一個(gè)實(shí)現(xiàn)了 aenter() 和 aexit() 方法的 Python 對(duì)象。

在我們深入了解異步上下文管理器的細(xì)節(jié)之前,讓我們回顧一下經(jīng)典的上下文管理器。

1.1. Context Manager

上下文管理器是一個(gè) Python 對(duì)象,它實(shí)現(xiàn)了 enter() 和 exit() 方法。

  • enter() 方法定義了塊開(kāi)頭發(fā)生的事情,例如打開(kāi)或準(zhǔn)備資源,如文件、套接字或線程池。
  • exit() 方法定義退出塊時(shí)發(fā)生的情況,例如關(guān)閉準(zhǔn)備好的資源。

通過(guò)“with”表達(dá)式使用上下文管理器。通常,上下文管理器對(duì)象是在“with”表達(dá)式的開(kāi)頭創(chuàng)建的,并且會(huì)自動(dòng)調(diào)用 enter() 方法。內(nèi)容的主體通過(guò)命名的上下文管理器對(duì)象使用資源,然后 aexit() 方法在塊退出時(shí)自動(dòng)調(diào)用,通?;蛲ㄟ^(guò)異常。

...
# open a context manager
with ContextManager() as manager:
	# ...
# closed automatically

這反映了 try-finally 表達(dá)式。

...
# create the object
manager = ContextManager()
try:
	manager.__enter__()
	# ...
finally:
	manager.__exit__()

1.2. Asynchronous Context Manager

“PEP 492 – Coroutines with async and await syntax”引入了異步上下文管理器。

它們提供了一個(gè)上下文管理器,可以在進(jìn)入和退出時(shí)掛起。

aenteraexit 方法被定義為協(xié)同程序,由調(diào)用者等待。這是使用“async with”表達(dá)式實(shí)現(xiàn)的。

因此,異步上下文管理器只能在 asyncio 程序中使用,例如在調(diào)用協(xié)程中。

  • 什么是“async with”

“async with”表達(dá)式用于創(chuàng)建和使用異步上下文管理器。它是“with”表達(dá)式的擴(kuò)展,用于異步程序中的協(xié)程。

“async with”表達(dá)式就像用于上下文管理器的“with”表達(dá)式,除了它允許在協(xié)同程序中使用異步上下文管理器。

為了更好地理解“async with”,讓我們仔細(xì)看看異步上下文管理器。async with 表達(dá)式允許協(xié)程創(chuàng)建和使用上下文管理器的異步版本。

...
# create and use an asynchronous context manager
async with AsyncContextManager() as manager:
	# ...

這相當(dāng)于:

...
# create or enter the async context manager
manager = await AsyncContextManager()
try:
	# ...
finally:
	# close or exit the context manager
	await manager.close()

請(qǐng)注意,我們正在實(shí)現(xiàn)與傳統(tǒng)上下文管理器大致相同的模式,只是創(chuàng)建和關(guān)閉上下文管理器涉及等待協(xié)程。

這會(huì)暫停當(dāng)前協(xié)程的執(zhí)行,調(diào)度一個(gè)新的協(xié)程并等待它完成。因此,異步上下文管理器必須實(shí)現(xiàn)必須通過(guò) async def 表達(dá)式定義的 aenter() 和 aexit() 方法。這使得它們自己協(xié)程也可能等待。

2. 如何使用異步上下文管理器

在本節(jié)中,我們將探討如何在我們的 asyncio 程序中定義、創(chuàng)建和使用異步上下文管理器。

2.1. 定義

我們可以將異步上下文管理器定義為實(shí)現(xiàn) aenter() 和 aexit() 方法的 Python 對(duì)象。

重要的是,這兩種方法都必須使用“async def”定義為協(xié)程,因此必須返回可等待對(duì)象。

# define an asynchronous context manager
class AsyncContextManager:
    # enter the async context manager
    async def __aenter__(self):
        # report a message
        print('>entering the context manager')
    # exit the async context manager
    async def __aexit__(self, exc_type, exc, tb):
        # report a message
        print('>exiting the context manager')

因?yàn)槊總€(gè)方法都是協(xié)程,所以它們本身可能等待協(xié)程或任務(wù)。

# define an asynchronous context manager
class AsyncContextManager:
    # enter the async context manager
    async def __aenter__(self):
        # report a message
        print('>entering the context manager')
        # block for a moment
        await asyncio.sleep(0.5)
    # exit the async context manager
    async def __aexit__(self, exc_type, exc, tb):
        # report a message
        print('>exiting the context manager')
        # block for a moment
        await asyncio.sleep(0.5)

2.2. 使用

通過(guò)“async with”表達(dá)式使用異步上下文管理器。這將自動(dòng)等待進(jìn)入和退出協(xié)程,根據(jù)需要暫停調(diào)用協(xié)程。

...
# use an asynchronous context manager
async with AsyncContextManager() as manager:
	# ...

因此,“async with”表達(dá)式和異步上下文管理器更普遍地只能在 asyncio 程序中使用,例如在協(xié)程中。

現(xiàn)在我們知道如何使用異步上下文管理器,讓我們看一個(gè)有效的例子。

3. 異步上下文管理器和“異步”示例

我們可以探索如何通過(guò)“async with”表達(dá)式使用異步上下文管理器。

在這個(gè)例子中,我們將更新上面的例子,以正常方式使用上下文管理器。

我們將使用“async with”表達(dá)式,并在一行中創(chuàng)建并進(jìn)入上下文管理器。這將自動(dòng)等待 enter 方法。

然后我們可以在內(nèi)部塊中使用管理器。在這種情況下,我們將只報(bào)告一條消息。

退出內(nèi)部塊將自動(dòng)等待上下文管理器的退出方法。將這個(gè)例子與前面的例子進(jìn)行對(duì)比,可以看出“async with”表達(dá)式在 asyncio 程序中為我們做了多少繁重的工作。

# SuperFastPython.com
# example of an asynchronous context manager via async with
import asyncio
# define an asynchronous context manager
class AsyncContextManager:
    # enter the async context manager
    async def __aenter__(self):
        # report a message
        print('>entering the context manager')
        # block for a moment
        await asyncio.sleep(0.5)
    # exit the async context manager
    async def __aexit__(self, exc_type, exc, tb):
        # report a message
        print('>exiting the context manager')
        # block for a moment
        await asyncio.sleep(0.5)
# define a simple coroutine
async def custom_coroutine():
    # create and use the asynchronous context manager
    async with AsyncContextManager() as manager:
        # report the result
        print(f'within the manager')
# start the asyncio program
asyncio.run(custom_coroutine())

運(yùn)行示例首先創(chuàng)建 main() 協(xié)程并將其用作 asyncio 程序的入口點(diǎn)。

main() 協(xié)程運(yùn)行并在“async with”表達(dá)式中創(chuàng)建我們的 AsyncContextManager 類的實(shí)例。

該表達(dá)式自動(dòng)調(diào)用 enter 方法并等待協(xié)程。報(bào)告一條消息,協(xié)程暫時(shí)阻塞。

main() 協(xié)程恢復(fù)并執(zhí)行上下文管理器的主體,打印一條消息。

塊退出,自動(dòng)等待上下文管理器的退出方法,報(bào)告消息并休眠片刻。

這突出了 asyncio 程序中異步上下文管理器的正常使用模式。

>entering the context manager
within the manager
>exiting the context manager

以上就是如何使用Python異步之上下文管理器的詳細(xì)內(nèi)容,更多關(guān)于Python異步之上下文管理器的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python自帶的IDE在哪里

    Python自帶的IDE在哪里

    在本篇內(nèi)容里小編給大家分享的是關(guān)于如何找到Python自帶的IDE的相關(guān)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2020-07-07
  • python中路徑字符串斜杠替換方式

    python中路徑字符串斜杠替換方式

    這篇文章主要介紹了python中路徑字符串斜杠替換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 基于Python實(shí)現(xiàn)開(kāi)發(fā)釘釘通知機(jī)器人

    基于Python實(shí)現(xiàn)開(kāi)發(fā)釘釘通知機(jī)器人

    在項(xiàng)目協(xié)同工作或自動(dòng)化流程完成時(shí),我們需要用一定的手段通知自己或他人。Telegram 非常好用,幾個(gè)步驟就能創(chuàng)建一個(gè)機(jī)器人,可惜在國(guó)內(nèi)無(wú)法使用。所以本文就來(lái)開(kāi)發(fā)一個(gè)釘釘通知機(jī)器人吧
    2023-02-02
  • Python實(shí)現(xiàn)npy/mat文件的保存與讀取

    Python實(shí)現(xiàn)npy/mat文件的保存與讀取

    除了常用的csv文件和excel文件之外,我們還可以通過(guò)Python把數(shù)據(jù)保存文npy文件格式和mat文件格式。本文為大家展示了實(shí)現(xiàn)npy文件與mat文件的保存與讀取的示例代碼,需要的可以參考一下
    2022-04-04
  • Python從函數(shù)參數(shù)類型引出元組實(shí)例分析

    Python從函數(shù)參數(shù)類型引出元組實(shí)例分析

    這篇文章主要介紹了Python從函數(shù)參數(shù)類型引出元組,結(jié)合實(shí)例形式分析了Python函數(shù)定義與使用中常見(jiàn)的三種參數(shù)類型,并簡(jiǎn)單分析了元組類型參數(shù)的使用,需要的朋友可以參考下
    2019-05-05
  • python assert斷言的實(shí)例用法

    python assert斷言的實(shí)例用法

    在本篇文章里小編給大家整理了一篇關(guān)于python assert斷言的實(shí)例用法,有需要的朋友們可以跟著學(xué)習(xí)參考下。
    2021-09-09
  • Python 使用 docopt 解析json參數(shù)文件過(guò)程講解

    Python 使用 docopt 解析json參數(shù)文件過(guò)程講解

    這篇文章主要介紹了Python 使用 docopt 解析json參數(shù)文件過(guò)程講解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • python實(shí)現(xiàn)用于測(cè)試網(wǎng)站訪問(wèn)速率的方法

    python實(shí)現(xiàn)用于測(cè)試網(wǎng)站訪問(wèn)速率的方法

    這篇文章主要介紹了python實(shí)現(xiàn)用于測(cè)試網(wǎng)站訪問(wèn)速率的方法,涉及Python中urllib2模塊及時(shí)間的相關(guān)操作技巧,需要的朋友可以參考下
    2015-05-05
  • anaconda升級(jí)sklearn版本的實(shí)現(xiàn)方法

    anaconda升級(jí)sklearn版本的實(shí)現(xiàn)方法

    這篇文章主要介紹了anaconda升級(jí)sklearn版本的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Python實(shí)現(xiàn)自定義異常實(shí)例

    Python實(shí)現(xiàn)自定義異常實(shí)例

    大家好,本篇文章主要講的是Python實(shí)現(xiàn)自定義異常實(shí)例,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01

最新評(píng)論

襄汾县| 榆林市| 屏山县| 铜山县| 白玉县| 保靖县| 胶州市| 沙坪坝区| 稻城县| 始兴县| 崇明县| 定襄县| 贡嘎县| 绥宁县| 岱山县| 巴彦县| 科技| 蕉岭县| 右玉县| 高陵县| 萍乡市| 玉山县| 宁津县| 福海县| 潢川县| 桃园县| 资兴市| 梅河口市| 玉门市| 夏河县| 金华市| 金平| 泰宁县| 上林县| 柯坪县| 阳城县| 平阳县| 米易县| 林芝县| 定州市| 昆山市|