日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python async_python async with和async for的使用

發(fā)布時(shí)間:2023/12/15 python 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python async_python async with和async for的使用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

網(wǎng)上async with和async for的中文資料比較少,我把PEP 492中的官方陳述翻譯一下。

異步上下文管理器”async with”

異步上下文管理器指的是在enter和exit方法處能夠暫停執(zhí)行的上下文管理器。

為了實(shí)現(xiàn)這樣的功能,需要加入兩個(gè)新的方法:__aenter__ 和__aexit__。這兩個(gè)方法都要返回一個(gè) awaitable類型的值。

異步上下文管理器的一種使用方法是:

class AsyncContextManager:

async def __aenter__(self):

await log('entering context')

async def __aexit__(self, exc_type, exc, tb):

await log('exiting context')

新語法

異步上下文管理器使用一種新的語法:

async with EXPR as VAR:

BLOCK

這段代碼在語義上等同于:

mgr = (EXPR)

aexit = type(mgr).__aexit__

aenter = type(mgr).__aenter__(mgr)

exc = True

VAR = await aenter

try:

BLOCK

except:

if not await aexit(mgr, *sys.exc_info()):

raise

else:

await aexit(mgr, None, None, None)

和常規(guī)的with表達(dá)式一樣,可以在一個(gè)async with表達(dá)式中指定多個(gè)上下文管理器。

如果向async with表達(dá)式傳入的上下文管理器中沒有__aenter__ 和__aexit__方法,這將引起一個(gè)錯(cuò)誤 。如果在async def函數(shù)外面使用async with,將引起一個(gè)SyntaxError(語法錯(cuò)誤)。

例子

使用async with能夠很容易地實(shí)現(xiàn)一個(gè)數(shù)據(jù)庫事務(wù)管理器。

async def commit(session, data):

...

async with session.transaction():

...

await session.update(data)

...

需要使用鎖的代碼也很簡單:

async with lock:

...

而不是:

with (yield from lock):

...

異步迭代器 “async for”

一個(gè)異步可迭代對象(asynchronous iterable)能夠在迭代過程中調(diào)用異步代碼,而異步迭代器就是能夠在next方法中調(diào)用異步代碼。為了支持異步迭代:

1、一個(gè)對象必須實(shí)現(xiàn)__aiter__方法,該方法返回一個(gè)異步迭代器(asynchronous iterator)對象。

2、一個(gè)異步迭代器對象必須實(shí)現(xiàn)__anext__方法,該方法返回一個(gè)awaitable類型的值。

3、為了停止迭代,__anext__必須拋出一個(gè)StopAsyncIteration異常。

異步迭代的一個(gè)例子如下:

class AsyncIterable:

def __aiter__(self):

return self

async def __anext__(self):

data = await self.fetch_data()

if data:

return data

else:

raise StopAsyncIteration

async def fetch_data(self):

...

新語法

通過異步迭代器實(shí)現(xiàn)的一個(gè)新的迭代語法如下:

async for TARGET in ITER:

BLOCK

else:

BLOCK2

這在語義上等同于:

iter = (ITER)

iter = type(iter).__aiter__(iter)

running = True

while running:

try:

TARGET = await type(iter).__anext__(iter)

except StopAsyncIteration:

running = False

else:

BLOCK

else:

BLOCK2

把一個(gè)沒有__aiter__方法的迭代對象傳遞給 async for將引起TypeError。如果在async def函數(shù)外面使用async with,將引起一個(gè)SyntaxError(語法錯(cuò)誤)。

和常規(guī)的for表達(dá)式一樣, async for也有一個(gè)可選的else 分句。.

例子1

使用異步迭代器能夠在迭代過程中異步地緩存數(shù)據(jù):

async for data in cursor:

...

這里的cursor是一個(gè)異步迭代器,能夠從一個(gè)數(shù)據(jù)庫中每經(jīng)過N次迭代預(yù)取N行數(shù)據(jù)。

下面的語法展示了這種新的異步迭代協(xié)議的用法:

class Cursor:

def __init__(self):

self.buffer = collections.deque()

async def _prefetch(self):

...

def __aiter__(self):

return self

async def __anext__(self):

if not self.buffer:

self.buffer = await self._prefetch()

if not self.buffer:

raise StopAsyncIteration

return self.buffer.popleft()

接下來這個(gè)Cursor 類可以這樣使用:

async for row in Cursor():

print(row)

which would be equivalent to the following code:

i = Cursor().__aiter__()

while True:

try:

row = await i.__anext__()

except StopAsyncIteration:

break

else:

print(row)

例子2

下面的代碼可以將常規(guī)的迭代對象變成異步迭代對象。盡管這不是一個(gè)非常有用的東西,但這段代碼說明了常規(guī)迭代器和異步迭代器之間的關(guān)系。

class AsyncIteratorWrapper:

def __init__(self, obj):

self._it = iter(obj)

def __aiter__(self):

return self

async def __anext__(self):

try:

value = next(self._it)

except StopIteration:

raise StopAsyncIteration

return value

async for letter in AsyncIteratorWrapper("abc"):

print(letter)

為什么要拋出StopAsyncIteration?

協(xié)程(Coroutines)內(nèi)部仍然是基于生成器的。因此在PEP 479之前,下面兩種寫法沒有本質(zhì)的區(qū)別:

def g1():

yield from fut

return 'spam'

def g2():

yield from fut

raise StopIteration('spam')

自從 PEP 479 得到接受并成為協(xié)程 的默認(rèn)實(shí)現(xiàn),下面這個(gè)例子將StopIteration包裝成一個(gè)RuntimeError。

async def a1():

await fut

raise StopIteration('spam')

告知外圍代碼迭代已經(jīng)結(jié)束的唯一方法就是拋出StopIteration。因此加入了一個(gè)新的異常類StopAsyncIteration。

由PEP 479的規(guī)定 , 所有協(xié)程中拋出的StopIteration異常都被包裝在RuntimeError中。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。

本文標(biāo)題: python async with和async for的使用

本文地址: http://www.cppcns.com/jiaoben/python/262859.html

總結(jié)

以上是生活随笔為你收集整理的python async_python async with和async for的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 不用播放器的av网站 | 99er这里只有精品 | 国产高清无遮挡 | 黄色一级片国产 | 91亚洲国产成人精品一区 | 黄色网页在线观看 | 制服丝袜先锋 | 91久久精品视频 | 18成人免费观看网站 | 欧美在线不卡视频 | av999| 伊人逼逼 | 老鸭窝视频在线观看 | 亚洲少妇一区二区三区 | 夜间福利网站 | www.黄色片网站 | 久草黄色 | 人人91| 少妇按摩一区二区三区 | 丁香网五月天 | 欧美日韩日本国产 | 91性高潮久久久久久久久 | 一本亚洲 | 人妻熟女一区二区aⅴ水野 91在线观看视频 | 噜噜噜视频 | 午夜精品偷拍 | 久久免费片 | 91插插插永久免费 | 欧美18一20男同69gay | 九九综合久久 | 国产中文字字幕乱码无限 | 少妇逼逼 | 秘密基地动漫在线观看免费 | 91嫩草在线 | 成人a级大片 | 中文字幕不卡av | 少妇久久久久久 | 九九在线精品 | 中文字幕无码人妻少妇免费 | 亚洲国产欧美日韩在线 | 成人a级网站| 久操精品 | 婷婷国产成人精品视频 | 性色av一区二区三区红粉影视 | 超碰在线观看免费 | 日韩黄片一区二区三区 | 日本最新中文字幕 | 成人短视频在线观看 | 99一区二区三区 | 成人在线三级 | 一级特黄色大片 | 91精品福利 | 国产精品乱码一区二三区小蝌蚪 | 久久综合伊人77777麻豆 | 蘑菇视频黄色 | 久久久久久夜 | 波多野结衣在线影院 | 国模在线观看 | 日本精品视频一区 | 8mav在线 | 西野翔夫の目の前で犯在线 | 久久久久久久美女 | 少妇粉嫩小泬喷水视频www | 日韩中文欧美 | 三日本三级少妇三级99 | 日韩一区二区三区三四区视频在线观看 | 超级变态重口av番号 | 人妻精品一区二区在线 | 丰满少妇被猛烈进入一区二区 | 一级艳片新婚之夜 | 三级欧美韩日大片在线看 | 蜜桃在线一区二区三区 | 天天干在线播放 | 美女主播福利视频 | 大黄网站在线观看 | 免看一级片 | 乌克兰极品av女神 | wwwxxx日本免费 | 天天爱天天草 | 中国少妇初尝黑人巨大 | 国产精品久久一区二区三区动 | 99精品热视频 | 熟女少妇一区二区三区 | 日韩av第一页 | 91久久国产精品 | 成人黄色在线网站 | 午夜激情小视频 | 一区二区三区国产在线观看 | av天天网 | 欧美日本韩国一区二区三区 | 色婷婷在线播放 | 色哟哟一区二区 | 拔擦8x成人一区二区三区 | 国产av毛片 | 国产人妖视频 | 韩国不卡av | 黄色aa网站| 少妇一级淫片免费放播放 | 特黄特色大片免费播放器使用方法 |