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
- 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 - scheint weniger Flexibilität bieten, wie die Funktion aufgerufen werden kann.
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. –