请问协程是goto这样理解对吗
协程就是goto吗?两者有何异同?
协程是一种计算机程序设计的组件,它范化了子例程的概念.协程非常适合用于实现一些有用的程序组件例如,协作式多任务,异常处理,事件循环,迭代器,无限链表和管道等.
下面对比一般的子例程和协程:
子例程的起始处是惟一的入口点,一旦退出即完成了子例程的执行,子例程的一个实例只会返回一次。
子程序总是在它的开始处被启动,它通常是一个固定的位置.共行程序总是在它上次结束处的下一位置被启动.
协程可以通过yield来调用其它协程。通过yield方式转移执行权的协程之间不是调用者与被调用者的关系,而是彼此对称、平等的。
子例程容易实现于堆栈之上,因为子例程将调用的其他子例程作为下级。相反地,协程对等地调用其他协程,最好的实现是用 continuations(由有垃圾回收的堆实现)以跟踪控制流程。
Marlin对coroutine的特性描述如下:
coroutine中的局部变量在后续调用中保持有效.
当控制离开的时候coroutine被挂起,将控制权交还给它的时候在它挂起的地方继续执行.
协程的分类
1)通过控制转移机制分类:对称协程与非对称协程
非对称协程(asymmetric),或称为半对称协程(semi-symmetric)或半协程(semi-coroutines).非对称协程可以被看作是调用者的从属过程,它们之间的关系跟调用和被调用例程的关系类似.
对称协程只提供了一种控制转移机制:将执行流程交给指定的协程.因为对称协程之间可以互相转移执行流程,所以它们之间的关系 就像在同一个层级.
2) 协程是否一级类型(first-class)
3) 是否有完整的栈
有完整栈的协程,允许协程在最内层的函数中挂起自己.以后此协程被resume将会从它被挂起的 地方继续执行.
没有完整栈的协程,例如python的generator,则只能在generator的主body中被挂起.
有完整栈的协程可以用于实现用户级多任务而没有完整栈的协程则不行.
协程的关键字是yield,个人觉得含义应该是:
中断执行,返回数据.再次调用,回到断点,恢复执行.
yield 等价于 return 并且 goto breakpoint.
goto是在同一个函数中跳转,协程应该类似于setjump
和longjump
,这个是在不同函数间跳转。
这么说不准确,应该说协程一个主要功能就是跨函数的goto,当然,在需要时还能goto回来,这一点更像函数调用。
玩蛇网文章,转载请注明出处和文章网址:https://www.iplaypy.com/wenda/wd18471.html
相关文章 Recommend
- • macos x中python是默认就有的吗?
- • pycharm编辑器‘�û�δ��这种乱码,需要转码还
- • 列表里边是元组数据,用python正则怎么完成匹配
- • 又是python乱码问题,excel类型文件单元格内数据有
- • 想转业学python,请问应该如何规划自己的学习计划
- • 使用django在做添加superuser操作时报错\xBA\xA3像是乱
- • python语言中的pcap与dpkt在统计中的作用分别是什么
- • 为什么读取通过cookielib方法得到的cookies返回值是
- • 模板渲染前端js和后端python哪个更好
- • 不小心删除了pythonwin,重装之后提示不是有效的
- • 新手对python default不是很理解它有什么用途
- • 怎么解决python tornado总是需要重启的问题
必知PYTHON教程 Must Know PYTHON Tutorials
- • python 解释器
- • python idle
- • python dir函数
- • python 数据类型
- • python type函数
- • python 字符串
- • python 整型数字
- • python 列表
- • python 元组
- • python 字典
- • python 集合
- • python 变量
- • python print
- • python 函数
- • python 类定义
- • python import
- • python help
- • python open
- • python 异常处理
- • python 注释
- • python continue
- • python pass
- • python return
- • python global
- • python assert
- • python if语句
- • python break
- • python for循环
- • python while循环
- • python else/elif
- • lambda匿名函数
必知PYTHON模块 Must Know PYTHON Modules
- • os 模块
- • sys 模块
- • re 正则表达式
- • time 日期时间
- • pickle 持久化
- • random 随机
- • csv 模块
- • logging 日志
- • socket网络通信
- • json模块
- • urlparse 解析URL
- • urllib 模块
- • urllib2 模块
- • robotparser 解析
- • Cookie 模块
- • smtplib 邮件
- • Base64 编码
- • xmlrpclib客户端
- • string 文本
- • Queue 线程安全
- • math数学计算
- • linecache缓存
- • threading多线程
- • sqlite3数据库
- • gzip压缩解压
最新内容 NEWS
- • django app提供pv信息的方法是什么
- • Django项目版本升级如何操作?
- • django较多数据传递如何优雅的呈现
- • django1.7获取参数问题求助
- • Django1.7使用内置comment遇到问题
- • python mysql数据库做insert操作时报_mysql_ex
- • 关于python mysql的duplicate insert机制的疑问
- • pymongo使用insert函数批量插入被中断要怎么
- • Python程序员解决棘手问题的常用库
- • 求助关于restfull api接口几个问题
图文精华 RECOMMEND
-
django1.7获取参数问题求助
-
Python程序员解决棘手问题的常用库
-
求问str()同__str__原理上有什么不同
-
scrapy框架里面用link extractor怎么能
-
python {}.fromkeys创建字典append添加操
-
python3 类型Type str doesn't support th
热点文章 HOT
- 学习Python有什么好的书籍推荐?
- Python匿名函数 Lambda表达式作用
- Python与Java、C、Ruby、PHP等编程语言有什么
- Python 正则中文网页字符串提取问题
- 如何为实时性应用存取经纬度?django my
- 想用python做个客户端,在二维码登录这个地
- 有让IDE可识别Python函数参数类型的方法吗
- Python字符串转换成列表正则疑问