聲明:本人只是分享一些床長的免費雜文而已,並非床長人工智慧網校的收費文章。
使用定義的函數或方法中yield表達式的存在 還將該函數定義為 異步生成器函數。async def
調用異步生成器函數時,它將返回一個稱為異步生成器對象的異步迭代器。然後,該對象控制生成器功能的執行。異步生成器對象通常在協程函數的語句中使用,類似於在 語句中使用生成器對象的方式。async forfor
調用異步生成器的方法之一將返回一個 等待對象,並且在等待該對象時開始執行。那時,執行繼續進行到第一個yield表達式,在此處再次暫停執行,返回的值為 expression_list到等待的協程。與生成器一樣,暫停意味著保留所有局部狀態,包括局部變量的當前綁定,指令指針,內部評估堆棧以及任何異常處理的狀態。當等待異步生成器的方法返回的下一個對象來恢復執行時,該函數可以像yield表達式只是另一個外部調用一樣繼續進行。恢復後的yield表達式的值取決於恢復執行的方法。如果 __anext__()使用,則結果為None。否則,如果 asend()使用,則結果將是傳遞給該方法的值。
在異步生成器函數中,在try構造中的任何位置都可以使用yield表達式。但是,如果異步生成器在完成之前沒有恢復(通過達到零引用計數或通過垃圾回收),則try 構造中的yield表達式可能導致執行掛起finally 子句失敗。在這種情況下,運行異步生成器的事件循環或調度程序負責調用異步生成器-迭代器的aclose()方法並運行生成的協程對象,從而允許任何未決finally子句執行。
為了完成終結,事件循環應定義一個終結函數,該函數需要一個異步生成器-迭代器並可能調用aclose()並執行協程。該 終結器可以通過調用進行註冊sys.set_asyncgen_hooks()。第一次迭代時,異步生成器迭代器將存儲註冊的終結器,以在終結時調用。對於一個的參考例終結方法見實施 asyncio.Loop.shutdown_asyncgens在LIB / ASYNCIO / base_events.py。
在異步生成器函數中使用時,該表達式是語法錯誤。yield from <expr>
6.2.9.4。異步生成器迭代器方法
本小節描述了異步生成器迭代器的方法,這些方法用於控制生成器功能的執行。
協程agen.__anext__()
返回一個可等待的對象,該對象在運行時開始執行異步生成器或在最後執行的yield表達式處恢復運行。當使用__anext__() 方法恢復異步生成器函數時,當前yield表達式始終None在返回的awaitable中求值為,運行時將繼續到下一個yield表達式。的值expression_list的產率表達的是的值StopIteration由完成協程引發的異常。如果異步生成器退出而沒有產生另一個值,則waitable引發 StopAsyncIteration異常,表示異步迭代已完成。
通常通過循環隱式調用此方法。async for
協程agen.asend(value )
返回一個waiting,在運行時將恢復異步生成器的執行。與send()生成器的方法一樣,這會將值「發送」到異步生成器函數中,並且value參數成為當前yield表達式的結果。該asend()方法返回的awaitable 將返回生成器產生的下一個值作為throws 的值 StopIteration,或者StopAsyncIteration如果異步生成器退出而沒有生成另一個值,則返回該值。當 asend()被調用以啟動異步生成器時,必須使用None作為參數來調用它,因為沒有可以接收該值的yield表達式。
協程agen.athrow(類型[,值[,回溯] ] )
返回一個等待的對象,type該對象在異步生成器暫停的時刻引發類型異常,並返回生成器函數產生的下一個值作為引發StopIteration異常的值 。如果異步生成器退出而不產生另一個值,StopAsyncIteration則等待的對象會引發異常。如果生成器函數未捕獲傳入的異常,或引發了其他異常,則在運行awaitable時,該異常會傳播到awaitable的調用方。
協程agen.aclose()
返回一個等待的值,該值在運行時將GeneratorExit在暫停時將a 扔到異步生成器函數中。如果異步生成器函數隨後正常退出,已關閉或引發GeneratorExit(通過不捕獲異常),則返回的awaitable將引發StopIteration異常。後續對異步生成器的調用返回的任何其他可等待事件將引發StopAsyncIteration異常。如果異步生成器產生一個值,RuntimeError則由awaitable引發a。如果異步生成器引發任何其他異常,則將其傳播到awaitable的調用方。如果異步生成器由於異常或正常退出而已經退出,則對的進一步調用aclose()將返回不執行任何操作的waitable。