web-dev-qa-db-fra.com

Que fait la syntaxe "yield from" dans asyncio et en quoi est-elle différente de "wait"

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.

29
Azsgy

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.

39