Python異步之生成器怎么使用
本文講解"Python異步之生成器如何使用",希望能夠解決相關問題。
正文
生成器是 Python 的基本組成部分。生成器是一個至少有一個“yield”表達式的函數。它們是可以暫停和恢復的函數,就像協程一樣。
實際上,Python 協程是 Python 生成器的擴展。Asyncio 允許我們開發異步生成器。我們可以通過定義一個使用“yield”表達式的協程來創建一個異步生成器。
1. 什么是異步生成器
異步生成器是使用 yield 表達式的協程。在我們深入了解異步生成器的細節之前,讓我們先回顧一下經典的 Python 生成器。
1.1. Generators
生成器是一個 Python 函數,它通過 yield 表達式返回一個值。
# define a generator def generator(): for i in range(10): yield i
生成器執行到 yield 表達式,之后返回一個值。這會在該點暫停生成器。下一次執行生成器時,它將從恢復點恢復并運行直到下一個 yield 表達式。
從技術上講,生成器函數創建并返回一個生成器迭代器。生成器迭代器執行生成器函數的內容,根據需要產生和恢復。
可以使用內置函數 next() 分步執行生成器。
... # create the generator gen = generator() # step the generator result = next(gen)
雖然,更常見的是迭代生成器直到完成,例如使用 for 循環或列表理解。
... # traverse the generator and collect results results = [item for item in generator()]
接下來,讓我們仔細看看異步生成器。
1.2. Asynchronous Generators
異步生成器是使用 yield 表達式的協程。與函數生成器不同,協程可以調度和等待其他協程和任務。
與經典生成器一樣,異步生成器函數可用于創建可使用內置的 anext() 函數而不是 next() 函數遍歷的異步生成器迭代器。
這意味著異步生成器迭代器實現了 anext() 方法并且可以與 async for 表達式一起使用。
這意味著生成器的每次迭代都被安排并執行為可等待的。 “async for”表達式將調度并執行生成器的每次迭代,暫停調用協程并等待結果。
2. 如何使用異步生成器
在本節中,我們將仔細研究如何在 asyncio 程序中定義、創建、步進和遍歷異步生成器。
讓我們從如何定義異步生成器開始。
2.1. 定義
我們可以通過定義一個至少有一個 yield 表達式的協程來定義一個異步生成器。
這意味著該函數是使用“async def”表達式定義的。
# define an asynchronous generator async def async_generator(): for i in range(10) yield i
因為異步生成器是一個協程,并且每個迭代器返回一個在 asyncio 事件循環中調度和執行的等待對象,所以我們可以在生成器主體內執行和等待等待對象。
# 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. 創建
要使用異步生成器,我們必須創建生成器。這看起來像是調用它,而是創建并返回一個迭代器對象。
... # create the iterator it = async_generator()
這將返回一種稱為異步生成器迭代器的異步迭代器。
2.3. 一步
可以使用 anext() 內置函數遍歷生成器的一個步驟,就像使用 next() 函數的經典生成器一樣。
結果是等待的可等待對象。
... # 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
這可以一步實現。
... # step the async generator result = await anext(gen)
2.4. 遍歷
還可以使用“async for”表達式在循環中遍歷異步生成器,該表達式將自動等待循環的每次迭代。
... # 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”循環遍歷生成器直至完成。
此循環將自動等待從生成器返回的每個可等待對象,檢索產生的值,并使其在循環體內可用,以便在這種情況下可以報告它。
這可能是異步生成器最常見的使用模式。
# 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())
運行示例首先創建 main() 協程并將其用作 asyncio 程序的入口點。main() 協程運行并啟動 for 循環。
異步生成器的一個實例被創建,循環使用 anext() 函數自動單步執行它以返回一個可等待對象。然后循環等待可等待對象并檢索一個值,該值可用于報告它的循環體。
然后重復此過程,掛起 main() 協程,執行生成器的迭代,然后掛起和恢復 main() 協程,直到生成器耗盡。
這突出顯示了如何使用 async for 表達式遍歷異步生成器。
0
1
2
3
4
5
6
7
8
9
關于 "Python異步之生成器如何使用" 就介紹到此。希望多多支持碩編程。
- python中f字符串以及其常見用法介紹
- Python的gtts庫將文字轉為音頻應該如何操作
- 在Python里面調用Golang代碼的方法
- Python?Pyperclip模塊怎么安裝和使用
- Python異步之怎么保護任務免于取消
- python中的Pyperclip模塊功能是什么
- Python反射機制怎么應用
- Python錯誤JSONDecodeError:?Expecting?value:?line?1?column?1怎么解決
- Python數據可視化之Pyecharts如何使用
- Python HTTP請求
- Python HTTP響應
- Python 連接重用
- Python Telnet
- Python 電子郵件
- Python POP3
- Python 并發簡介
- Python 系統和內存架構
- Python 線程
- Python 線程通信
- Python 反應式編程