异步IO-yield from 源代码剖析

yield from 处理的事情 
1. 子生成器可能是一个迭代器,并不是一个作为协程的生成器,所以他不支持throw 
2. 如果子生成器支持throw和close方法,但是在子生成器内部,这两个方法都会抛出异常 
3. 调用方让子生成器自己抛出异常 
4. 当调用方使用next或者send(None)时,都要在子生成器上调用next()函数,当调用发送非None值时, 才调用子生成器的.send()方法 
5.会处理close的异常和Base异常的方法 
 yield总结关键点: 
1.子生成器生产的值,都是直接传递给调用方的,调用方通过.send发送的值也是直接传递给子生成器的next方法, 如过不是None,则调用子生成器的.send()方法 
2.子生成器退出的时候,最后的return EXPR 会触发一个StopIterration异常, 
3. yield from 表达式的值,是子生成器终止时,传递给StopIteration异常的第一个值 
4. 如果调用的时候出现StopIteration异常,委托生成器恢复运行,同时其他的异常向上冒泡 
5. 传入委托生成器的异常李,除了GeneratorExit之外,其他的所有异常全部传递给子生成器的throw()方法, 如果调用了throw的时候出现了StopIteration异常,那么久灰度委托生成器的运行,其它的异常全部向上冒泡. 
6. 如果在委托生成器上调用.close()或传入GeneratorExit异常,会调用子生成器的.close()方法,没有的话不调用, 如果在调用close的时候抛出了异常,那么久向上冒泡,否则的话委托生成器会抛出GeneratorExit异常 


RESULT = yield from EXPR 可以简化成下面这样


_i:子生成器,同时也是一个迭代器
_y:子生成器生产的值
_r:yield from 表达式最终的值
_s:调用方通过send()发送的值
_e:异常对象

"""

_i= iter(EXPR)  # EXPR是一个可迭代对象 ,_i其实是子成器
try:
    _y  =next(_i) # 预激活子生成器,把产出的第一个值存在_y中:
except StopIteration as e:
    _r = _e.value # 入股破抛出StopIteration异常,那么就将异常对象的值赋给_r
else:
    while 1: # 尝试执行这个循环,委托生成器会阻塞
        _s = yield _y # 生产子生成器的值,等待调用方send()值,并将发送过来的值保存在_s中
        try:
            _y = _i.send(_s) # 转发_s,并且尝试向下执行
        except StopIteration as _e: # 如果子生成器抛出异常,那么就获取异常对象的值
            _r = e.value # 赋值给value
            break
RESULT = _r  # 把value的值赋值给RESULT

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学渣王菜菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值