刚刚介绍了pythonyield关键字,趁热打铁,现在来了解一下yield实现协程。

引用官方的说法:

与线程相比,协程更轻量。一个python线程大概占用8M内存,而一个协程只占用1KB不到内存。协程更适用于IO密集型的应用。

当然在讲协程的实现之前,有必要先来看一下send方法。

send方法

yield表达式有一个返回值,send方法的作用就是控制这个返回值,send的参数就是yield表达式的返回值。我们来看一下官方文档上关于send的定义:

举个栗子:

上面的代码输出:

第一次调用next的时候,程序从函数最开始处运行,打印出

before yield

执行到yield处,停在该处。

接下来,向生成器send(1) 。send在这里起到两个作用,一个是将参数赋给yield的返回值,然后该返回值赋给了变量x;一个是继续程序的执行,直到下一次遇到yield停下来,第二个功能和next相似。其实,next就相当于send(None)。

之心了send(1)后,x被赋值给yield的返回值,即send的参数1,并继续往下执行,打印出了

after yield:1

继续执行,回到循环的开始,向下执行,打印出

before yield

再次遇到yield,停在该处,等待下一次send 或者next的调用。

向生成器send(2)。这里的步骤和send(1)相同,打印出下面两条后,在yield处停住。

after yield:2

before yield

执行next(g),x被赋值为yield表达式的返回值,也就是None,继续向下执行,打印出

after yield:None

再次回到循环的开始,向下执行,打印出

before yield

程序运行结束

现在是不是有点理解send了?

yield和send实现python协程

我们用协程实现一个生产者、消费者的例子:

运行上面的程序,会输出:

produce函数负责生产数据,consume函数负责消费数据。具体执行过程如下:

1  首先调用consume函数。consume函数的返回是一个生成器,把这个生成器传入produce函数。

2  produce函数中调用next(c)启动生成器。

3  计算n = n + 1生成数据,一旦生产了数据,调用c.send(n) 切换到consume执行。

4  consume函数中拿到数据后赋值给n,继续执行yield后面的语句

5  consume函数中打印消费的数据,并设置返回值r,又回到循环的开始,通过yield把结果传回。

6  produce拿到consume返回的值,继续生产下一个数据。

7  5个数据生产完毕后,循环结束,通过c.close() 关闭consume,结束全过程

produce和consume函数在一个线程内执行,通过调用send方法和yield互相切换,实现协程的功能

python yield 协程_用yield实现python协程相关推荐

  1. c++ 协程_用yield实现协程

    上一篇 理解python中的yield关键字 介绍了使用yeld实现生成器函数,这一篇我们来继续深入的了解一下yield,用yield实现协程. 先来解答一下上一篇留下的问题:下面的代码为什么第二次调 ...

  2. python知识点总结全_【转】Python高级知识点总结

    一.可迭代对象.迭代器对象和生成器 像list, tuple等这些序列是可以使用for...in ...语句来进行遍历输出的.这是为什么呢?这就需要知道可迭代对象(Iterable).迭代器对象(It ...

  3. 我的python学习笔记全集_记录我的Python学习笔记

    不想再像以前那样,什么都从头开始学习语法.总结语法,这样反而会过分纠结于语法,耽误了开发,毕竟语言的主要属性是工具,次要的属性是语言本身. 所以还是先熟练使用语言去进行开发,等足够熟悉了,再去研究语言 ...

  4. python语言运行效率高_如何评价说PYTHON是最快的语言?

    我是视频的作者,首先感谢朋友们的关注,并且诞生了这个论题,让我可以看到大家对我视频中的观点的反馈.对于大家的讨论,在日常时间允许的条件下,我会尽量参与.下面就我目前已经看到的朋友们的评论,做一下展开. ...

  5. python常用库教程_这几个python常用的库你必须知道!

    随着人工智能时代的到来,python变得更加流行.受欢迎,功能强大.简单易学.容易入门.应用广泛等,掀起了学习热潮,现在越来越多人转行都会学习python语言.为了让大家快速掌握python,今天为大 ...

  6. python领域语言教案_第一单元 走进Python 编程世界

    (共17张PPT) 今年一场突如其来的新冠肺炎不仅使得人人带上了口罩,过了一个不一样的寒假,同时也使得我们以不一样的方式开启我们的学习. 同学们你们知道那些人容易得肺炎重症呢? 有基础病的 身体素质差 ...

  7. python怎么打日志_怎样调试 日志 python 代码

    展开全部 使用 pdb 进行调试 pdb 是 python 自带e5a48de588b662616964757a686964616f31333361306366的一个包,为 python 程序提供了一 ...

  8. c++中的引用和python中的引用_对比 C++ 和 Python,谈谈指针与引用

    作者 | 樱雨楼 引言 指针(Pointer)是 C.C++ 以及 Java.Go 等语言的一个非常核心且重要的概念,而引用(Reference)是在指针的基础上构建出的一个同样重要的概念. 指针对于 ...

  9. python入门第一课_入门第一课 Python入门涉及的问题及简单示例

    很多初学者都在问:我想自学Python,该怎样入门?入门选择哪些书籍? 下面,我以自己的理解作出解答. 1.先说明大体的学习进度. Python确实入门较为容易,语法清晰易懂.一旦入了门再想提高就和其 ...

最新文章

  1. 我们总结了每个技术团队都会遇到的 4 个难题
  2. 笔记-项目范围管理-需求工程-需求管理
  3. 机器学习 KD树_递归_回溯_搜索(matlab实现)
  4. Java通过IText导出word和pdf
  5. 最新Jmeter版本常用技巧集锦
  6. MyEclipse提示Errors occurred during the build
  7. Halcon 圆形标定板标定基本流程-标定助手操作
  8. 初学者Pytorch 和 Caffe 使用对比
  9. oracle 自动化运维--自动搭建oracle dataguard 运维工具(开发源代码)
  10. 学生抗疫HTML网页设计作品 学生疫情网页模板 大学生抗疫感动专题网页设计作业 HTML学生抗疫网站作业设计
  11. 支付宝提现要手续费吗?
  12. 万字干货 | 如何从0到1搭建一套会员体系
  13. Kafka入门三:几种消费方式
  14. paddle.paramattr转换为torch框架下算法
  15. 用huggingface.transformers在文本分类任务(单任务和多任务场景下)上微调预训练模型
  16. 【Lambda】LCAC第十四次会议重要内容摘取
  17. 新生宝宝办证-STEP1-出生证明办理
  18. http协议,http状态码,请求,响应
  19. 对于共享电脑的到来,您有什么想说的
  20. 使用kali破解WiFi抓不住包问题和No such BSSID available.问题的解决方法----airodump-ng、aireplay-ng

热门文章

  1. 无线局域网标准、技术的发展、应用
  2. 三极管开关和机械开关区别
  3. 【Linux】十问 Linux 虚拟内存管理
  4. C++ 中的继承和多态
  5. AutoCad 基础概念
  6. Shell 标准输入和输出
  7. QT界面设计添加BUTTON不显示
  8. 微信小程序开发——消除Now you can provide attr `wx:key` for a `wx:for` to improve performance.
  9. pg_walreceiver
  10. 中国家政服务行业发展环境及趋势分析报告2022-2027年