2017-05-29 1 views
7

Du point de vue de quelqu'un qui a écrit du code asyncio mais qui cherche à mieux comprendre le fonctionnement interne, qu'est-ce que yield from, await et comment sont ceux utiles pour permettre le code asynchrone?Que fait la syntaxe "yield from" en asyncio et en quoi est-elle différente de "await"

Il y a une highly upvoted question portant sur les utilisations de la syntaxe yield from et one explaining async and await, mais les deux vont en profondeur sur des sujets différents et ne sont pas vraiment une explication concise du code sous-jacent et la façon dont il s'inscrit dans asyncio.

+0

Il semble que la deuxième question que vous avez liée donne une explication assez simple de la façon dont 'async' et' await' peuvent être utilisés pour exprimer de façon plus succincte ce que vous aviez besoin de 'yield from' & 'asyncio.coroutine 'exprimer. Je suppose que je ne suis pas vraiment sûr de ce que la question demande puisque cet exemple semble l'expliquer plutôt bien. Peux-tu être plus précis? – mgilson

+0

@mgilson cela va dans la façon dont 'await' se rapporte à' yield from 'mais pas réellement ce que 'yield from' fait – Atsch

+0

Ils sont identiques, sauf' await' est plus [récent] (https: //www.python. org/dev/peps/pep-0492 /) et semble beaucoup mieux – Vincent

Répondre

8

Réponse courte:

yield from est une ancienne d'attendre pour coroutine.

await est une façon moderne d'attendre la coroutine.

réponse détaillée:

python a des générateurs - type particulier de fonctions qui produit une séquence de résultats au lieu d'une seule valeur. À partir de Python 3.3 yield from expression a été ajoutée. Il allows un générateur pour déléguer une partie de ses opérations à un autre générateur.

A partir de Python 3.4, le module asyncio a été ajouté à la bibliothèque standard. Cela nous permet d'écrire du code asynchrone clair et compréhensible. Tandis que techniquement les coroutines d'asyncio pouvaient être implémentées de différentes façons, en asyncio elles ont été implémentées en utilisant des générateurs (vous pouvez regarder excellent video où montré comment les générateurs peuvent être utilisés pour implémenter des coroutines). @asyncio.coroutine était une façon de faire de la coroutine à partir du générateur et yield from était un moyen d'attendre pour la coroutine - juste des détails de l'implémentation.

C'est ainsi 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. Ce n'est pas seulement plus court à écrire, mais il est aussi plus clair de comprendre que nous travaillons avec des coroutines.

Si vous utilisez Python 3.5+, vous pouvez oublier d'utiliser yield from pour tout sauf les générateurs et utiliser await pour les coroutines.

+0

Holy c ** p, @mikhail, j'aurais aimé lire ceci avant de perdre tellement de temps avec 'yield from' et' @ asyncio.coroutine' ! Puis j'ai lu 'async def' et' await', et je suis allé "ummmm, je me demande quelle est la différence". Je souhaite que cela soit rendu plus clair dans [PEP 3156] (https://www.python.org/dev/peps/pep-3156) ... – Marco