![](/img/trans.png)
[英]What is an 'async_generator' & how is it different from a 'coroutine' in Python 3.6?
[英]Python coroutine/generator terminology in async context
網上說的
當您在 Python 中有一個異步函數(協程)時,您可以使用 async def 聲明它,這會改變其調用的行為方式。 特別是,調用它會立即返回一個協程對象,它基本上是說“我可以使用你調用的參數運行協程,並在你等待我時返回結果”
因此,當您在不等待的情況下調用async
函數時,您將返回一個協程。
為什么我要回一個協程,為什么不只是一個生成器? 因為我不會向它發送任何未來的輸入。
當協程首次出現在 Python 3.4 中時,它們是使用生成器實現的:
import asyncio
from typing import Generator
@asyncio.coroutine
def test1():
pass
assert isinstance(test1(), Generator)
並不是因為協程總是應該是生成器,只是碰巧它們是:這是實現它們的最方便的方式。
從 Python 3.5 開始,協程得到了它們的新語法async def
/ await
,它既干凈又有助於區分抽象(協程)與其實現細節(生成器)。
似乎新式協程也被修補以表明它們不應該被視為生成器:
async def test2():
pass
assert not isinstance(test2(), Generator)
長話短說:在處理協程時忘記生成器。 如果您使用像協程這樣的異步抽象,您應該使用它們而不是它們的實現細節。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.