Du point de vue de quelqu'un qui a écrit du code asyncio mais cherche à mieux comprendre le fonctionnement interne, ce qui est yield from
, await
et comment sont-ils utiles pour autoriser le code asynchrone?
Il y a une très votée question demandant à propos de l'utilisation du yield from
syntaxe et l'un expliquant async et attendant , mais tous deux approfondissent différents sujets et ne sont pas vraiment une explication concise du code sous-jacent et de la façon dont il s'intègre à asyncio.
Réponse courte:
yield from
est une ancienne façon d'attendre la coroutine d'Asyncio.
await
est une façon moderne d'attendre la coroutine d'Asyncio.
Réponse détaillée:
Python a des générateurs - un type spécial de fonctions qui produit une séquence de résultats au lieu d'une seule valeur. Commençant par Python 3.3 yield from
expression a été ajoutée. Il permet un générateur de déléguer une partie de ses opérations à un autre générateur.
À partir de Python 3.4 asyncio
module a été ajouté à la bibliothèque standard. Il nous permet d'écrire du code asynchrone clair et compréhensible. Alors que techniquement les coroutines d'Asyncio peuvent être implémentées de différentes manières, dans asyncio
ils ont été implémentés à l'aide de générateurs (vous pouvez regarder excellente vidéo où montré comment les générateurs peuvent être utilisés pour implémenter des coroutines). @asyncio.coroutine
était un moyen de faire de la coroutine à partir du générateur et yield from
était un moyen d'attendre la coroutine - juste des détails de mise en œuvre.
Voilà comment est arrivé que yield from
a commencé à être utilisé pour deux "choses différentes".
À partir de Python 3.5 (voir PEP 492 ) les coroutines ont une nouvelle syntaxe. Vous pouvez maintenant définir la coroutine avec async def
et l'attendre en utilisant l'expression await
. Il est non seulement plus court à écrire, mais permet également de comprendre que nous travaillons avec les coroutines d'Asyncio.
Si vous utilisez Python 3.5+, vous pouvez oublier d'utiliser yield from
pour les coroutines d'asyncio et utilisez await
pour cela.