Coroutine 终止协程和异常处理
- 终止协程和异常处理
- 协程中未处理的异常会向上冒泡,传给 next 函数或 send 方法的调用方(即触发协程的对象)
- 终止协程的一种方式:发送某个哨符值,让协程退出。内置的 None 和
- Ellipsis 等常量经常用作哨符值。 Ellipsis 的优点是,数据流中不太常有这个值。有人把
- StopIteration 类(类本身,而不是实例,也不抛出)作为哨符值;也就是说,
- 是像这样使用的: my_coro.send(StopIteration)。从 Python 2.5 开始,客户代码可以在
- 生成器对象上调用两个方法,显式地把异常发给协程。这两个方法是 throw 和 close。
- generator.throw(exc_type[, exc_value[, traceback]])
- 致使生成器在暂停的 yield 表达式处抛出指定的异常。如果生成器处理了抛出的异
- 常,代码会向前执行到下一个 yield 表达式,而产出的值会成为调用 generator.throw
- 方法得到的返回值。如果生成器没有处理抛出的异常,异常会向上冒泡,传到调用方的上
- 下文中。
- generator.close()
- 致使生成器在暂停的 yield 表达式处抛出 GeneratorExit 异常。如果生成器没有处
- 理这个异常,或者抛出了 StopIteration 异常(通常是指运行到结尾),调用方不会报
- 错。如果收到 GeneratorExit 异常,生成器一定不能产出值,否则解释器会抛出
- RuntimeError 异常。生成器抛出的其他异常会向上冒泡,传给调用方。
- 让协程返回值
- from collections import namedtuple
- Results = namedtuple('Result', 'count average')
- def coro_average_return():
- total = 0.0
- count = 0
- average = None
- while 1:
- term = yield # 这一版不产出值
- if term is None: # 发送 None 会终止循环,导致协程结束,返回结果。一如既往,生成器对象会抛出 StopIteration 异常。异常对象的 value 属性保存着返回的值。
- break
- total += term
- count += 1
- average = total / count
- return Results(count, average)
- coro4 = coro_average_return()
- next(coro4)
- coro4.send(10)
- coro4.send(15)
- coro4.send(3)
- try:
- coro4.send(None)
- except StopIteration as exe:
- result = exe.value # return 表达式的值会偷偷传给调用方,赋值给 StopIteration 异常的一个属性。
- # 这样做有点不合常理,但是能保留生成器对象的常规行为——耗尽时抛出 StopIteration 异常。
- 获取协程的返回值虽然要绕个圈子,但这是 PEP 380 定义的方式,当我们意识到这一点之
- 后就说得通了: yield from 结构会在内部自动捕获 StopIteration 异常。这种处理方
- 式与 for 循环处理 StopIteration 异常的方式一样:循环机制通过用户易于理解的方式
- 处理异常。对 yield from 结构来说,解释器不仅会捕获 StopIteration 异常,还会把
- value 属性的值变成 yield from 表达式的值。但是,我们无法在控制台中使用交互的方
- 式测试这种行为,因为在函数外部使用 yield from(以及 yield)会导致句法出错。
Coroutine 终止协程和异常处理的更多相关文章
- C#中的yield return与Unity中的Coroutine(协程)(下)
Unity中的Coroutine(协程) 估计熟悉Unity的人看过或者用过StartCoroutine() 假设我们在场景中有一个UGUI组件, Image: 将以下代码绑定到Image using ...
- Boost.Coroutine2:学习使用Coroutine(协程)
function(函数)routine(例程)coroutine (协程) 函数,例程以及协程都是指一系列的操作的集合. 函数(有返回值)以及例程(没有返回值)也被称作subroutine(子例程), ...
- Lua基础之coroutine(协程)
概括:1.创建协程2.coroutine的函数3.coroutine的基本流程4.yield对coroutine流程的干预5.resume, function()以及yield之间的参数传递和返回值传 ...
- Routine Subroutine Coroutine 子程序 协程
https://en.wikipedia.org/wiki/Subroutine In computer programming, a subroutine is a sequence of prog ...
- Routine Subroutine Coroutine 子程序 协程 子例程
https://en.wikipedia.org/wiki/Subroutine In computer programming, a subroutine is a sequence of prog ...
- C#中的yield return与Unity中的Coroutine(协程)(上)
C#中的yield return C#语法中有个特别的关键字yield, 它是干什么用的呢? 来看看专业的解释: yield 是在迭代器块中用于向枚举数对象提供值或发出迭代结束信号.它的形式为下列之一 ...
- Python协程深入理解
从语法上来看,协程和生成器类似,都是定义体中包含yield关键字的函数.yield在协程中的用法: 在协程中yield通常出现在表达式的右边,例如:datum = yield,可以产出值,也可以不产出 ...
- 【Python】【容器 | 迭代对象 | 迭代器 | 生成器 | 生成器表达式 | 协程 | 期物 | 任务】
Python 的 asyncio 类似于 C++ 的 Boost.Asio. 所谓「异步 IO」,就是你发起一个 IO 操作,却不用等它结束,你可以继续做其他事情,当它结束时,你会得到通知. Asyn ...
- 流畅的python第十六章协程学习记录
从句法上看,协程与生成器类似,都是定义体中包含 yield 关键字的函数.可是,在协程中,yield 通常出现在表达式的右边(例如,datum = yield),可以产出值,也可以不产出——如果 yi ...
随机推荐
- Java 利用Map集合计算一个字符串中每个字符出现的次数
步骤分析 1.给出一串字符串,字符串中可以包含字母.数字.符号等等. 2.创建一个Map集合,key是字符串中的字符,value是字符的个数. 3.遍历字符串,获取每一个字符. 5.使用获取到的字符, ...
- 七种武器:JavaScript 新特性闪亮登场
JavaScript(或ECMA Script) 是一门不断发展的语言,有许多关于如何前进的建议和想法.TC39(技术委员会39)是负责定义JS标准和特性的委员会,今年他们非常活跃.以下是目前处于&q ...
- Linux查看端口监听占用
# 查看所有 netstat -ntlp # 过滤PORT8080 netstat -ntlp | grep 8080 -t # 仅显示tcp相关选项 -u # 仅显示udp相关选项 -n # 拒绝显 ...
- 【C_Language】---一份程序看懂C程序printf()的几种常用用法
闲来继续巩固我的学习之路,今天略微整理了一下,C程序中Printf()的一些常用用法,虽然自己以前好像会,但是不够系统,今天大致整理了一些,先贴上来看看,以后在看到其他,继续补充,希望能帮到一些像我一 ...
- 字典树(增删改查 HDU 5687)
度熊手上有一本神奇的字典,你可以在它里面做如下三个操作: 1.insert : 往神奇字典中插入一个单词 2.delete: 在神奇字典中删除所有前缀等于给定字符串的单词 3.search: 查询是否 ...
- spring boot 集成apollo 快速指南
目前市面上流行的三大配置中心框架:Spring CLoud Config .Alibaba Nacos 以及携程apollo, 我们相应架构组号召,就使用Apollo吧. Work Flow 简单解释 ...
- 150行代码打造.net core生产力工具,你值得拥有
你是否在初学 .net core时,被依赖注入所折磨? 你是否在开发过程中,为了注入依赖而不停的在Startup中增加注入代码,而感到麻烦? 你是否考虑过或寻找过能轻松实现自动注入的组件? 如果有,那 ...
- 【WPF学习】第十章 WPF布局示例
前几章用了相当大的篇幅研究有关WPF布局容器的复杂内容.在掌握了这些基础知识后,就可以研究几个完整的布局示例.通过研究完整的布局示例,可更好的理解各种WPF布局概念在实际窗口中的工作方式. 一.列设置 ...
- 「 从0到1学习微服务SpringCloud 」04服务消费者Ribbon+RestTemplate
系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现 「 从0到1学习微服务S ...
- 笔记常用Linux命令(二) 进程和端口
查看系统进程 ps:用于报告当前系统的进程状态 a:显示所有终端机下执行的程序 ps -ef/ps aux: 这两个命令都是查看当前系统正在运行进程,两者的区别是展示格式不同. 如果想要查看特定的进程 ...