Maison  >  Questions et réponses  >  le corps du texte

异步编程 - Python中的yield from的用法?

对于yield from目前我只知道这一种用法,我对它的理解也停留在yield from generator

In [1]: def reader():
   ...:     """A generator that fakes a read from a file, socket, etc."""
   ...:     for i in range(4):
   ...:         yield '<< %s' % i
   ...:         

In [2]: def reader_wrapper(g):
   ...:     yield from g
   ...:     

In [3]: wrap = reader_wrapper(reader())

In [4]: for i in wrap:
   ...:     print(i)
   ...:     
<< 0
<< 1
<< 2
<< 3

但是在廖雪峰的异步IO教程中看见一个yield from的新用法,请问下面这个yield from asyncio.sleep(1)是什么意思,asyncio.sleep(1)也是一个生成器吗?看官方文档也没有给出明确的解释,也是直接贴的代码,拜托大神解释一下!

import asyncio

@asyncio.coroutine
def hello():
    print("Hello world!")
    # 异步调用asyncio.sleep(1):
    r = yield from asyncio.sleep(1)
    print("Hello again!")

# 获取EventLoop:
loop = asyncio.get_event_loop()
# 执行coroutine
loop.run_until_complete(hello())
loop.close()
迷茫迷茫2762 Il y a quelques jours464

répondre à tous(4)je répondrai

  • 怪我咯

    怪我咯2017-04-18 10:06:59

    Trouvez d'abord la définition de la fonction asyncio.sleep()

    coroutine asyncio.sleep(delay, result=None, *, loop=None)
    

    C'est-à-dire que cette fonction est une fonction coroutine. La fonction coroutine peut être appelée comme ceci pour obtenir la valeur de retour

    result = await coroutine or result = yield from coroutine 

    Quant à savoir pourquoi peut-il être utilisé de cette manière ?

    1. attendre lui-même est un mot-clé utilisé dans les coroutines

    2. .
    3. peut utiliser le mot-clé yield car l'implémentation de coroutine est basée sur un générateur. Quant à savoir pourquoi utiliser yield fromAu lieu de l'original <. 🎜>yield, cela doit avoir une source, vous pouvez voir PEP380. Bref, c'est plus gênant d'utiliser le rendement pour obtenir des informations de coroutine, j'ai donc ajouté un rendement de pour simplifier l'opération.https:/ /www.python.org/dev/pe...

    Résumez comme suit : vous pouvez utiliser

    yield car coroutine est basée sur un générateur, il n'est donc pas faux de dire que sleep renvoie un générateur. La raison pour laquelle from apparaît est qu'il est trop difficile d'utiliser simplement yield. Vous pouvez le considérer comme du sucre de syntaxe. Pour plus de détails, veuillez consulter PEP8..

    PS : Juste quelques mots à la fin. C'est pourquoi je ne recommande pas de lire des blogs pour apprendre un langage. C'est également gratuit. Pourquoi ne pas choisir la documentation officielle Python, plus fiable et plus détaillée ?

    répondre
    0
  • PHPz

    PHPz2017-04-18 10:06:59

    L'essence de la coroutine est un générateur

    Vous pouvez regarder cette vidéo~
    Explorez l'implémentation de la fonctionnalité async/await dans Python 3.5

    répondre
    0
  • PHPz

    PHPz2017-04-18 10:06:59

    Pourquoi devez-vous l'emballer une fois ?

    for i in reader():
        print(i)
    

    Est-ce que cela peut également être utilisé ? Très perplexe. . .

    répondre
    0
  • 巴扎黑

    巴扎黑2017-04-18 10:06:59

    Vous pouvez lire cet article écrit par l'auteur Python, traduction approximative

    répondre
    0
  • Annulerrépondre