刚刚介绍了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互相切换,实现协程的功能

用yield实现python协程的更多相关文章

  1. 00.用 yield 实现 Python 协程

    来源:Python与数据分析 链接: https://mp.weixin.qq.com/s/GrU6C-x4K0WBNPYNJBCrMw 什么是协程 引用官方的说法: 协程是一种用户态的轻量级线程,协 ...

  2. 终结python协程----从yield到actor模型的实现

    把应用程序的代码分为多个代码块,正常情况代码自上而下顺序执行.如果代码块A运行过程中,能够切换执行代码块B,又能够从代码块B再切换回去继续执行代码块A,这就实现了协程 我们知道线程的调度(线程上下文切 ...

  3. 从yield 到yield from再到python协程

    yield 关键字 def fib(): a, b = 0, 1 while 1: yield b a, b = b, a+b yield 是在:PEP 255 -- Simple Generator ...

  4. Python协程笔记 - yield

    生成器(yield)作为协程 yield实际上是生成器,在python 2.5中,为生成器增加了.send(value)方法.这样调用者可以使用send方法对生成器发送数据,发送的数据在生成器中会赋值 ...

  5. 从yield到yield from再到python协程

    yield 关键字 def fib(): a,b = 0,1 while 1: yield b a,b = b,a+b yield是在:PEP 255 -- Simple Generators 这个p ...

  6. Python 协程总结

    Python 协程总结 理解 协程,又称为微线程,看上去像是子程序,但是它和子程序又不太一样,它在执行的过程中,可以在中断当前的子程序后去执行别的子程序,再返回来执行之前的子程序,但是它的相关信息还是 ...

  7. day-5 python协程与I/O编程深入浅出

    基于python编程语言环境,重新学习了一遍操作系统IO编程基本知识,同时也学习了什么是协程,通过实际编程,了解进程+协程的优势. 一.python协程编程实现 1.  什么是协程(以下内容来自维基百 ...

  8. [转载] Python协程从零开始到放弃

    Python协程从零开始到放弃 Web安全 作者:美丽联合安全MLSRC   2017-10-09  3,973   Author: lightless@Meili-inc Date: 2017100 ...

  9. python协程详解

    目录 python协程详解 一.什么是协程 二.了解协程的过程 1.yield工作原理 2.预激协程的装饰器 3.终止协程和异常处理 4.让协程返回值 5.yield from的使用 6.yield ...

随机推荐

  1. 安装sublime text2 for ubuntu

        Add our Sublime Text 2 Ubuntu PPA using the following commands: sudo add-apt-repository ppa:webu ...

  2. Python List 基础学习

    list&tuple&dict list list 常见操作 初始化: list1 = [123, 'abc', 4.56, ['inner', 'list'], 7-9j] list ...

  3. java Html 转 PDF

    Html 转 PDF 使用 flying-saucer 插件来完成 导入flying-saucer依赖 <dependency> <groupId>org.xhtmlrende ...

  4. Node.js压缩与解压数据

    Node.js中提供了一个很好的库Zlib来压缩解压数据. 一.压缩缓冲区 Zlib中有下面几个函数方便解压缩缓冲区. gzip/gunzip:标准gzip压缩. deflate/inflate:基于 ...

  5. C# 谁改了我的代码

    本文告诉大家一个特殊的做法,可以修改一个字符串常量 我们来写一个简单的程序,把一个常量字符串输出 private const string str = "lindexi"; sta ...

  6. JavaScript学习笔记系列1:JavaScript的是什么?

    一.JS是什么? JavaScript作为Netscape Navigator浏览器的一部分首次出现在1996年.它最初的设计目标是改善网页的用户体验. 作者:Brendan Eich 期初JavaS ...

  7. C# 分页方法

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Web; ...

  8. Dubbo下载-从missing artifactId说起

    项目pom文件引入dubbo 报 missing artifactId https://github.com/dangdangdotcom/dubbox 从GitHub上直接下载解压包, 最好下载分支 ...

  9. 序列化模块1 json

    ......得到一个 字符串 的结果 过程就叫序列化 字典 / 列表 / 数字 /对象 -序列化->字符串 为什么要序列化 # 1.要把内容写入文件 序列化 # 2.网络传输数据 序列化 字符串 ...

  10. Anaconda多环境多版本python配置笔记

    一.Conda测试过程: 使用conda.首先确认已经安装好了conda 配置环境.下一步通过创建几个环境来展示conda的环境管理功能.学习如何确认在哪个环境中,以及如何做复制一个环境作为备份. 测 ...