2

Python 3.5 erweiterte die Unterstützung für asynchrone Programmierung mit einer neuen Syntax für die Funktionsdefinition erheblich. Während Asynchron-Funktionen waren bisher nur „Generatoren mit Leistungen“:Warum sollte ich jemals `async def` über `@ asyncio.coroutine` verwenden wollen?

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 
    """ 

sie jetzt ihre eigene besondere Erklärung Syntax und besonderes Verhalten haben, mit denen sie nicht mehr wie gewohnt Generatorfunktionen verwendbar sind:

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 

Diese ist nicht eine Frage über die funktionalen oder praktischen Unterschiede zwischen diesen Typen - das ist in this StackOverflow answer diskutiert.

Meine Frage ist: Warum sollte ich jemals async def verwenden? Es scheint, wie es keinen zusätzlichen Nutzen gegenüber @asyncio.coroutine bietet, sondern erlegt zusätzliche Kosten, da es

  1. bricht Abwärtskompatibilität (Python 3.5 Code mit async def werden nicht einmal Parse in älteren Versionen, obwohl dies wohl ein Merkmal und kein Fehler) und
  2. scheint weniger Flexibilität bieten, wie die Funktion aufgerufen werden kann.
+1

Ich habe den Tag 'syntax' entfernt und den' python' hinzugefügt. Im Allgemeinen sollten Sie das Python-Tag zu allen Python-Fragen hinzufügen, da dies das Tag ist, das die meisten Leute verfolgen. –

Antwort

3

Eine mögliche Antwort wird durch Martijn Pieters gegeben:

Die Vorteile sind, dass mit nativer Unterstützung, können Sie auch zusätzliche Syntax einführen, um asynchronen Kontext-Manager und Iteratoren zu unterstützen. Die Eingabe und einen Kontextmanager Verlassen oder über einen Iterator Looping dann mehr Punkte in Ihrem Co-Routine werden kann, dass die anderen Codesignal stattdessen laufen kann, weil etwas wieder wartet

Dies hat in der Tat kommen mit neuen Früchte tragen async with und async for Syntax, die nicht so leicht mit einer "tack-on" -Lösung wie ein dekorierter Generator implementiert werden kann.

Verwandte Themen