日韩性视频-久久久蜜桃-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| 暖暖成人免费视频 | 日本不卡在线 | 男女视频在线观看 | 亚洲免费成人在线 | 婚后打屁股高h1v1调教 | 天天cao| 91九色高潮 | xxxxwww国产 | 日韩精品导航 | 国产成人看片 | 欧洲影院 | 久久99久久99精品免观看粉嫩 | av最新天堂 | 99久99 | 久草久草久草 | 成年人av网站 | 总裁憋尿呻吟双腿大开憋尿 | 精品一区二三区 | 中文字幕在线免费 | 看国产一级片 | 欧美一区二不卡视频 | 国产一区二区三区www | 欧美午夜精品久久久久久孕妇 | 亚洲一区在线电影 | 香蕉一区二区三区四区 | 性高跟丝袜xxxxhd | 亚洲av无码一区二区三区性色 | 欧美激情性做爰免费视频 | 国产伦精品一区二区三区千人斩 | 四虎永久在线精品免费一区二区 | 少妇又色又紧又黄又刺激免费 | 亚洲三区在线 | 涩涩视频在线观看免费 | 日批网站在线观看 | 扒下小娇妻的内裤打屁股 | 超碰888 | 成人欧美性 | 老司机精品视频在线播放 | 亚洲av少妇一区二区在线观看 | 菊肠扩张playh | 99久久国产宗和精品1上映 | 自拍第一页 | 性欧美视频在线观看 | 日本一区二区三区免费在线观看 | 狠狠爱亚洲 | 26uuu欧美日本 | 日韩精品福利视频 | 清纯唯美亚洲色图 | 欧洲激情网| 大胸奶汁乳流奶水出来h | 色呦呦网站入口 | 这里只有精品国产 | 欧美亚州 | 无码aⅴ精品一区二区三区浪潮 | 欧美在线视频你懂的 | 日本黄色大片视频 | xxxx亚洲 | 欧美精品乱码久久久久久按摩 | 草草在线观看视频 | 天海翼一二三区 | 国产精品一卡二卡三卡 | 国精品无码人妻一区二区三区 | 人妻少妇精品一区二区 | 国产精品久久久久久久 | 国产中文字幕精品 | 伊人久久亚洲综合 | 日韩av在线高清 | 欧美一区二区三区大屁股撅起来 | 国产日韩av在线播放 | 日本亚洲在线 | 好吊色一区二区三区 | www色亚洲| 日本偷拍一区 | 中文字幕在线观看一区二区三区 | www.youjizz国产 | 天天干网| av中文在线观看 | 丁香六月婷婷激情 | 国精品人妻无码一区二区三区喝尿 | 黄色片在线免费观看 | 成人无码精品1区2区3区免费看 | 欧美精品免费视频 | 日本少妇性高潮 | 疯狂做受xxxx高潮人妖 | 粉嫩av| 疯狂少妇 | 男女性高潮免费网站 | 天堂av亚洲av国产av电影 | 日韩精品一区二区在线 | 一眉道姑 电影 | 国产精久久久久久 | 亚洲福利国产 | 欧美一区影院 |