2

Python 3.5では、新しい関数定義構文による非同期プログラミングのサポートが大幅に拡張されました。非同期関数は、以前に単に「メリットとジェネレーター」されたのに対し:なぜ `@ asyncio.coroutine`に` async def`を使用したいのですか?

aysnc def generate_async_native(): 
    """ 
    A coroutine that returns 1 - 100 
    This CANNOT be used as a generator, and can ONLY be executed by running it from an event loop 
    """ 
    for i in range(100): 
     await i 

この:

def generate_numbers(): 
    """ 
    Generator function that lazily returns 1 - 100 
    """ 
    for i in range 100: 
     yield i 

generate_async = asyncio.coroutine(generate_numbers) 
generate_async.__doc__ = """ 
    Coroutine that lazily returns 1 - 100 
    This can be used interchangeably as a generator or a coroutine 
    """ 

彼らは今、独自の特殊な宣言構文と、彼らはもはや通常の発電機機能として使用可能であることにより、特別な行動を持っていますではないこれらのタイプ間の機能的差異または実際的差異については、this StackOverflow answerで説明しています。

私の質問は、なぜasync defを使いたいのですか?それは@asyncio.coroutine以上の追加の利点を提供していないように思えるが、これはあるものの、それ

  1. 休憩下位互換性(async def でのPython 3.5のコードでもは、古いバージョンでを解析していないという点で、追加コストを課し間違いなく機能でありバグではない)、
  2. は、どのように関数を呼び出すことができるかに柔軟性がないようです。
+1

私は 'syntax'タグを削除し、' python'タグを追加しました。一般に、PythonのタグはすべてのPythonの質問に追加する必要があります。なぜなら、ほとんどの人が追跡しているタグなのでです。 –

答えて

3

一つの可能​​な答えがMartijn Pietersで与えられます。

利点がネイティブにサポートして、あなたはまた、非同期のコンテキストマネージャとイテレータをサポートするために、追加のシンタックスを導入できるということです。何かが再び

を待機しているため、これは実際には新しいと結実に来た他のコードが代わりに実行できることを知らせるあなたのコルーチンでより多くのポイントになることができます入力すると、コンテキストマネージャを終了、またはイテレータをループasync withasync forという構文があります。これは装飾されたジェネレータのような "タックオン"ソリューションでは簡単に実装できません。

関連する問題