1. 终止协程和异常处理
  2.  
  3. 协程中未处理的异常会向上冒泡,传给 next 函数或 send 方法的调用方(即触发协程的对象)
  4. 终止协程的一种方式:发送某个哨符值,让协程退出。内置的 None
  5. Ellipsis 等常量经常用作哨符值。 Ellipsis 的优点是,数据流中不太常有这个值。有人把
  6. StopIteration 类(类本身,而不是实例,也不抛出)作为哨符值;也就是说,
  7. 是像这样使用的: my_coro.send(StopIteration)。从 Python 2.5 开始,客户代码可以在
  8. 生成器对象上调用两个方法,显式地把异常发给协程。这两个方法是 throw close
  9.  
  10. generator.throw(exc_type[, exc_value[, traceback]])
  11.   致使生成器在暂停的 yield 表达式处抛出指定的异常。如果生成器处理了抛出的异
  12. 常,代码会向前执行到下一个 yield 表达式,而产出的值会成为调用 generator.throw
  13. 方法得到的返回值。如果生成器没有处理抛出的异常,异常会向上冒泡,传到调用方的上
  14. 下文中。
  15.  
  16. generator.close()
  17.    致使生成器在暂停的 yield 表达式处抛出 GeneratorExit 异常。如果生成器没有处
  18. 理这个异常,或者抛出了 StopIteration 异常(通常是指运行到结尾),调用方不会报
  19. 错。如果收到 GeneratorExit 异常,生成器一定不能产出值,否则解释器会抛出
  20. RuntimeError 异常。生成器抛出的其他异常会向上冒泡,传给调用方。
  21.  
  22. 让协程返回值
  23.  
  24. from collections import namedtuple
  25.  
  26. Results = namedtuple('Result', 'count average')
  27.  
  28. def coro_average_return():
  29. total = 0.0
  30. count = 0
  31. average = None
  32. while 1:
  33. term = yield # 这一版不产出值
  34. if term is None: # 发送 None 会终止循环,导致协程结束,返回结果。一如既往,生成器对象会抛出 StopIteration 异常。异常对象的 value 属性保存着返回的值。
  35. break
  36. total += term
  37. count += 1
  38. average = total / count
  39. return Results(count, average)
  40.  
  41. coro4 = coro_average_return()
  42. next(coro4)
  43. coro4.send(10)
  44. coro4.send(15)
  45. coro4.send(3)
  46. try:
  47. coro4.send(None)
  48. except StopIteration as exe:
  49. result = exe.value # return 表达式的值会偷偷传给调用方,赋值给 StopIteration 异常的一个属性。
  50. # 这样做有点不合常理,但是能保留生成器对象的常规行为——耗尽时抛出 StopIteration 异常。
  51.  
  52. 获取协程的返回值虽然要绕个圈子,但这是 PEP 380 定义的方式,当我们意识到这一点之
  53. 后就说得通了: yield from 结构会在内部自动捕获 StopIteration 异常。这种处理方
  54. 式与 for 循环处理 StopIteration 异常的方式一样:循环机制通过用户易于理解的方式
  55. 处理异常。对 yield from 结构来说,解释器不仅会捕获 StopIteration 异常,还会把
  56. value 属性的值变成 yield from 表达式的值。但是,我们无法在控制台中使用交互的方
  57. 式测试这种行为,因为在函数外部使用 yield from(以及 yield)会导致句法出错。

Coroutine 终止协程和异常处理的更多相关文章

  1. C#中的yield return与Unity中的Coroutine(协程)(下)

    Unity中的Coroutine(协程) 估计熟悉Unity的人看过或者用过StartCoroutine() 假设我们在场景中有一个UGUI组件, Image: 将以下代码绑定到Image using ...

  2. Boost.Coroutine2:学习使用Coroutine(协程)

    function(函数)routine(例程)coroutine (协程) 函数,例程以及协程都是指一系列的操作的集合. 函数(有返回值)以及例程(没有返回值)也被称作subroutine(子例程), ...

  3. Lua基础之coroutine(协程)

    概括:1.创建协程2.coroutine的函数3.coroutine的基本流程4.yield对coroutine流程的干预5.resume, function()以及yield之间的参数传递和返回值传 ...

  4. Routine Subroutine Coroutine 子程序 协程

    https://en.wikipedia.org/wiki/Subroutine In computer programming, a subroutine is a sequence of prog ...

  5. Routine Subroutine Coroutine 子程序 协程 子例程

    https://en.wikipedia.org/wiki/Subroutine In computer programming, a subroutine is a sequence of prog ...

  6. C#中的yield return与Unity中的Coroutine(协程)(上)

    C#中的yield return C#语法中有个特别的关键字yield, 它是干什么用的呢? 来看看专业的解释: yield 是在迭代器块中用于向枚举数对象提供值或发出迭代结束信号.它的形式为下列之一 ...

  7. Python协程深入理解

    从语法上来看,协程和生成器类似,都是定义体中包含yield关键字的函数.yield在协程中的用法: 在协程中yield通常出现在表达式的右边,例如:datum = yield,可以产出值,也可以不产出 ...

  8. 【Python】【容器 | 迭代对象 | 迭代器 | 生成器 | 生成器表达式 | 协程 | 期物 | 任务】

    Python 的 asyncio 类似于 C++ 的 Boost.Asio. 所谓「异步 IO」,就是你发起一个 IO 操作,却不用等它结束,你可以继续做其他事情,当它结束时,你会得到通知. Asyn ...

  9. 流畅的python第十六章协程学习记录

    从句法上看,协程与生成器类似,都是定义体中包含 yield 关键字的函数.可是,在协程中,yield 通常出现在表达式的右边(例如,datum = yield),可以产出值,也可以不产出——如果 yi ...

随机推荐

  1. Java 利用Map集合计算一个字符串中每个字符出现的次数

    步骤分析 1.给出一串字符串,字符串中可以包含字母.数字.符号等等. 2.创建一个Map集合,key是字符串中的字符,value是字符的个数. 3.遍历字符串,获取每一个字符. 5.使用获取到的字符, ...

  2. 七种武器:JavaScript 新特性闪亮登场

    JavaScript(或ECMA Script) 是一门不断发展的语言,有许多关于如何前进的建议和想法.TC39(技术委员会39)是负责定义JS标准和特性的委员会,今年他们非常活跃.以下是目前处于&q ...

  3. Linux查看端口监听占用

    # 查看所有 netstat -ntlp # 过滤PORT8080 netstat -ntlp | grep 8080 -t # 仅显示tcp相关选项 -u # 仅显示udp相关选项 -n # 拒绝显 ...

  4. 【C_Language】---一份程序看懂C程序printf()的几种常用用法

    闲来继续巩固我的学习之路,今天略微整理了一下,C程序中Printf()的一些常用用法,虽然自己以前好像会,但是不够系统,今天大致整理了一些,先贴上来看看,以后在看到其他,继续补充,希望能帮到一些像我一 ...

  5. 字典树(增删改查 HDU 5687)

    度熊手上有一本神奇的字典,你可以在它里面做如下三个操作: 1.insert : 往神奇字典中插入一个单词 2.delete: 在神奇字典中删除所有前缀等于给定字符串的单词 3.search: 查询是否 ...

  6. spring boot 集成apollo 快速指南

    目前市面上流行的三大配置中心框架:Spring CLoud Config .Alibaba Nacos 以及携程apollo, 我们相应架构组号召,就使用Apollo吧. Work Flow 简单解释 ...

  7. 150行代码打造.net core生产力工具,你值得拥有

    你是否在初学 .net core时,被依赖注入所折磨? 你是否在开发过程中,为了注入依赖而不停的在Startup中增加注入代码,而感到麻烦? 你是否考虑过或寻找过能轻松实现自动注入的组件? 如果有,那 ...

  8. 【WPF学习】第十章 WPF布局示例

    前几章用了相当大的篇幅研究有关WPF布局容器的复杂内容.在掌握了这些基础知识后,就可以研究几个完整的布局示例.通过研究完整的布局示例,可更好的理解各种WPF布局概念在实际窗口中的工作方式. 一.列设置 ...

  9. 「 从0到1学习微服务SpringCloud 」04服务消费者Ribbon+RestTemplate

    系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现 「 从0到1学习微服务S ...

  10. 笔记常用Linux命令(二) 进程和端口

    查看系统进程 ps:用于报告当前系统的进程状态 a:显示所有终端机下执行的程序 ps -ef/ps aux: 这两个命令都是查看当前系统正在运行进程,两者的区别是展示格式不同. 如果想要查看特定的进程 ...