异步编程

编程入门 行业动态 更新时间:2024-10-25 08:22:41
本文介绍了异步编程 - 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()

解决方案

首先找到asyncio.sleep()函数的定义

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

也就是说这个函数是一个协程(coroutine)函数, 协程函数可以这样调用来得到返回值

result = await coroutine or result = yield from coroutine

至于为什么可以这么用?

  • await本身就是用在协程的一个关键词.

  • 可以用yield关键词, 是因为coroutine的实现是基于生成器的(Generator-based),至于为什么用yield from而不是原始的yield, 这肯定是有来源的,可以看PEP380. 总而言之就是用yield来获取协程的信息比较麻烦,于是就加了个yield from 来简化操作.www.python/dev/pe...

  • 总结以下: 可以用yield是因为coroutine是generator-based的,所以你说sleep返回的是generator其实也不算错, 为什么出现了from是因为只用yield太麻烦, 你可以认为是一个语法糖.具体可以看PEP8.

    PS:最后再BB几句, 这就是我为什么不推荐看博客学习一门语言的原因, 同样是免费的, 为什么不选择更加权威细致的python官方文档?

    更多推荐

    异步编程

    本文发布于:2023-11-23 13:48:02,感谢您对本站的认可!
    本文链接:https://www.elefans.com/category/jswz/34/1621652.html
    版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
    本文标签:

    发布评论

    评论列表 (有 0 条评论)
    草根站长

    >www.elefans.com

    编程频道|电子爱好者 - 技术资讯及电子产品介绍!