欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python 異步之生成器示例詳解

 更新時間:2023年03月22日 10:51:30   作者:冷凍工廠  
這篇文章主要為大家介紹了Python 異步之生成器示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

正文

生成器是 Python 的基本組成部分。生成器是一個至少有一個“yield”表達式的函數(shù)。它們是可以暫停和恢復的函數(shù),就像協(xié)程一樣。

實際上,Python 協(xié)程是 Python 生成器的擴展。Asyncio 允許我們開發(fā)異步生成器。我們可以通過定義一個使用“yield”表達式的協(xié)程來創(chuàng)建一個異步生成器。

1. 什么是異步生成器

異步生成器是使用 yield 表達式的協(xié)程。在我們深入了解異步生成器的細節(jié)之前,讓我們先回顧一下經典的 Python 生成器。

1.1. Generators

生成器是一個 Python 函數(shù),它通過 yield 表達式返回一個值。

# define a generator
def generator():
	for i in range(10):
		yield i

生成器執(zhí)行到 yield 表達式,之后返回一個值。這會在該點暫停生成器。下一次執(zhí)行生成器時,它將從恢復點恢復并運行直到下一個 yield 表達式。

從技術上講,生成器函數(shù)創(chuàng)建并返回一個生成器迭代器。生成器迭代器執(zhí)行生成器函數(shù)的內容,根據(jù)需要產生和恢復。

可以使用內置函數(shù) next() 分步執(zhí)行生成器。

...
# create the generator
gen = generator()
# step the generator
result = next(gen)

雖然,更常見的是迭代生成器直到完成,例如使用 for 循環(huán)或列表理解。

...
# traverse the generator and collect results
results = [item for item in generator()]

接下來,讓我們仔細看看異步生成器。

1.2. Asynchronous Generators

異步生成器是使用 yield 表達式的協(xié)程。與函數(shù)生成器不同,協(xié)程可以調度和等待其他協(xié)程和任務。

與經典生成器一樣,異步生成器函數(shù)可用于創(chuàng)建可使用內置的 anext() 函數(shù)而不是 next() 函數(shù)遍歷的異步生成器迭代器。

這意味著異步生成器迭代器實現(xiàn)了 anext() 方法并且可以與 async for 表達式一起使用。

這意味著生成器的每次迭代都被安排并執(zhí)行為可等待的。 “async for”表達式將調度并執(zhí)行生成器的每次迭代,暫停調用協(xié)程并等待結果。

2. 如何使用異步生成器

在本節(jié)中,我們將仔細研究如何在 asyncio 程序中定義、創(chuàng)建、步進和遍歷異步生成器。

讓我們從如何定義異步生成器開始。

2.1. 定義

我們可以通過定義一個至少有一個 yield 表達式的協(xié)程來定義一個異步生成器。

這意味著該函數(shù)是使用“async def”表達式定義的。

# define an asynchronous generator
async def async_generator():
	for i in range(10)
		yield i

因為異步生成器是一個協(xié)程,并且每個迭代器返回一個在 asyncio 事件循環(huán)中調度和執(zhí)行的等待對象,所以我們可以在生成器主體內執(zhí)行和等待等待對象。

# define an asynchronous generator that awaits
async def async_generator():
	for i in range(10)
		# suspend and sleep a moment
		await asyncio.sleep(1)
		# yield a value to the caller
		yield i

接下來,讓我們看看如何使用異步生成器。

2.2. 創(chuàng)建

要使用異步生成器,我們必須創(chuàng)建生成器。這看起來像是調用它,而是創(chuàng)建并返回一個迭代器對象。

...
# create the iterator
it = async_generator()

這將返回一種稱為異步生成器迭代器的異步迭代器。

2.3. 一步

可以使用 anext() 內置函數(shù)遍歷生成器的一個步驟,就像使用 next() 函數(shù)的經典生成器一樣。

結果是等待的可等待對象。

...
# get an awaitable for one step of the generator
awaitable = anext(gen)
# execute the one step of the generator and get the result
result = await awaitable

這可以一步實現(xiàn)。

...
# step the async generator
result = await anext(gen)

2.4. 遍歷

還可以使用“async for”表達式在循環(huán)中遍歷異步生成器,該表達式將自動等待循環(huán)的每次迭代。

...
# traverse an asynchronous generator
async for result in async_generator():
	print(result)

我們還可以使用帶有“async for”表達式的異步列表理解來收集生成器的結果。

...
# async list comprehension with async generator
results = [item async for item in async_generator()]

3. 異步生成器示例

我們可以探索如何使用“async for”表達式遍歷異步生成器。

在此示例中,我們將更新之前的示例以使用“async for”循環(huán)遍歷生成器直至完成。

此循環(huán)將自動等待從生成器返回的每個可等待對象,檢索產生的值,并使其在循環(huán)體內可用,以便在這種情況下可以報告它。

這可能是異步生成器最常見的使用模式。

# SuperFastPython.com
# example of asynchronous generator with async for loop
import asyncio
# define an asynchronous generator
async def async_generator():
    # normal loop
    for i in range(10):
        # block to simulate doing work
        await asyncio.sleep(1)
        # yield the result
        yield i
# main coroutine
async def main():
    # loop over async generator with async for loop
    async for item in async_generator():
        print(item)
# execute the asyncio program
asyncio.run(main())

運行示例首先創(chuàng)建 main() 協(xié)程并將其用作 asyncio 程序的入口點。main() 協(xié)程運行并啟動 for 循環(huán)。

異步生成器的一個實例被創(chuàng)建,循環(huán)使用 anext() 函數(shù)自動單步執(zhí)行它以返回一個可等待對象。然后循環(huán)等待可等待對象并檢索一個值,該值可用于報告它的循環(huán)體。

然后重復此過程,掛起 main() 協(xié)程,執(zhí)行生成器的迭代,然后掛起和恢復 main() 協(xié)程,直到生成器耗盡。

這突出顯示了如何使用 async for 表達式遍歷異步生成器。

0
1
2
3
4
5
6
7
8
9

以上就是Python 異步之生成器示例詳解的詳細內容,更多關于Python 異步生成器的資料請關注腳本之家其它相關文章!

相關文章

  • Python?圖形繪制詳細代碼(一)

    Python?圖形繪制詳細代碼(一)

    這篇文章主要介紹了Python?圖形繪制詳細代碼,文章主要從最簡單圖像的開始,在同一圖上繪制兩條或多條線一些簡單操作,想了解的小伙伴可以學習一下,希望對你的學習有所幫助
    2021-12-12
  • python讓列表倒序輸出的實例

    python讓列表倒序輸出的實例

    今天小編就為大家分享一篇python讓列表倒序輸出的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • Python中一些不為人知的基礎技巧總結

    Python中一些不為人知的基礎技巧總結

    這篇文章主要給大家總結介紹了Python中一些不為人知的基礎技巧,文中通過示例代碼介紹的非常詳細,對大家學習或者使用python具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-05-05
  • python爬取51job中hr的郵箱

    python爬取51job中hr的郵箱

    這篇文章主要為大家詳細介紹了python爬取51job中hr的郵箱的相關資料,需要的朋友可以參考下
    2016-05-05
  • springboot aop方式實現(xiàn)接口入?yún)⑿r灥氖纠a

    springboot aop方式實現(xiàn)接口入?yún)⑿r灥氖纠a

    在實際開發(fā)項目中,我們常常需要對接口入?yún)⑦M行校驗,本文主要介紹了springboot aop方式實現(xiàn)接口入?yún)⑿r灥氖纠a,具有一定的參考價值,感興趣的可以了解一下
    2023-08-08
  • Python中的“_args”和“__kwargs”用法詳解

    Python中的“_args”和“__kwargs”用法詳解

    *args 和 **kwargs 主要?于函數(shù)定義,你可以將不定數(shù)量的參數(shù)傳遞給?個函數(shù),這篇文章主要介紹了Python中的“_args”和“__kwargs”用法,需要的朋友可以參考下
    2023-01-01
  • python數(shù)據(jù)可視化plt庫實例詳解

    python數(shù)據(jù)可視化plt庫實例詳解

    這篇文章主要介紹了python可視化數(shù)據(jù)plt庫實例,下面使用pycharm環(huán)境給大家詳細介紹,文中提到jupyter和pycharm環(huán)境的差別,需要的朋友可以參考下
    2021-06-06
  • 利用Python將list列表寫入文件并讀取的方法匯總

    利用Python將list列表寫入文件并讀取的方法匯總

    因為實驗需要,實現(xiàn)了一下寫入txt文件,下面這篇文章主要給大家介紹了關于如何利用Python將list列表寫入文件并讀取的幾種方法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-03-03
  • Python學習之if 條件判斷語句

    Python學習之if 條件判斷語句

    篇文章主要介紹了Python if 條件判斷語句,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-10-10
  • 使用Python批量對文本文件編碼互轉的方法

    使用Python批量對文本文件編碼互轉的方法

    這篇文章主要介紹了使用Python批量對文本文件編碼互轉的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03

最新評論