1.协程的概念

  子程序或者子函数,在所有语言中都是层级调用,比如A调用B,再B执行的过程中又可以调用C,C执行完毕返回,B执行返回,最后是A执行完毕返回。是通过栈来实现的,一个线程就是执行一个自称,自称调用时一个入口,一次返回,调用的顺序是明确的。

  代码:

def C():
print("C--Start")
print("C--end") def B():
print("B--Start")
C()
print("B--end") def A():
print("A--Start")
B()
print("A--end") A() # A--Start
# B--Start
# C--Start
# C--end
# B--end
# A--end

  协程:看上去也是子程序,但是在执行过程中,在子程序内部可以中断。中断然后转而执行别的子程序,而不函数调用。

  协程与线程相比,协程的执行效率极高,因为只有一个线程,也不存在同时写变量的冲突,在协程中通向资源不加锁,只需要判断状态就可以了。比如如下的代码,可以如何处理?

def A():
print()
print()
print() def B():
print("x")
print("y")
print("z") # 执行这个结果而不用A调用B
# x y z
# 看起来A、B执行过程有点儿像线程,但协程特点在于是一个线程执行

2. 建立一个简单的协程

  协程是通过generator来实现的。

  先上代码:

def run():
print()
yield
print()
yield
print()
yield # 协程的最简单风格,控制函数的阶段执行,节约线程或者进程的切换。
# 返回值是一个生成器。
m = run()
print(next(m))

  说明:其实我们这里使用了一个生成器的概念。触发一个生成器,让生成器不断去执行。

  说明:yield = return,这两个的字面意思是一样的,但是yield的返回不是直接返回,而是等待用户操作,让其返回到么偶一个位置。

  

 3. 数据传输

  代码:

def run():
# 空变量,存储的作用data始终未空
data = "" r = yield data
# r = a
print(,r,data) r = yield data
# r= b
print(,r,data) r = yield data
# r = c
print(,r,data) r = yield data m = run() # 等于制作了一个生成器
# 启动m
print(m.send(None))
print(m.send("a"))
print(m.send("b"))
print(m.send("c")) #     注意这里是一个空值打印
# a
#
# b
#
# c

  说明1:.send()是发送信息给生成器。

  说明2:运行过程如下:(注意我们要把yield看做return就好理解了)

      第一步:先给函数发送一个None空值,接到到空值之后,yield返回data的空值给r,打印空。

      第二部分:我们给data发送一个“a”,然后yield返回data的“a”值给r,打印1,“a”

      后面类似。

  

  举例:我们用一个函数的形式把生成器传递给参数。

def producer(c):
c.send(None)
for i in range():
print("生产者产生数据%d" %i)
r = c.send(str(i))
print("消费者消费了数据%s" %r)
c.close() def customer():
data = ""
while True:
n = yield data
if not n:
return
print("消费者消费了%s" % n)
data = "" c = customer()
producer(c)
# 生产者产生数据0
# 消费者消费了0
# 消费者消费了数据200
# 生产者产生数据1
# 消费者消费了1
# 消费者消费了数据200
# 生产者产生数据2
# 消费者消费了2
# 消费者消费了数据200
# 生产者产生数据3
# 消费者消费了3
# 消费者消费了数据200
# 生产者产生数据4
# 消费者消费了4
# 消费者消费了数据200

Python笔记_第四篇_高阶编程_进程、线程、协程_4.协程的更多相关文章

  1. Python笔记_第四篇_高阶编程_进程、线程、协程_5.GPU加速

    Numba:高性能计算的高生产率 在这篇文章中,笔者将向你介绍一个来自Anaconda的Python编译器Numba,它可以在CUDA-capable GPU或多核cpu上编译Python代码.Pyt ...

  2. Python开发【第十三篇】高阶函数、递归函数、闭包

    函数式编程是指用一系列函数解决问题 好处:用每个函数完成每个细小的功能,一系列函数任意组合能够解决大问题 函数仅仅接收输入并产生输出,不包含任何能影响输出的内部状态 函数之间的可重入性 当一个函数的输 ...

  3. python学习三十四天函数高阶函数定义及用法

    python函数高阶函数是把函数当成一个变量,传递给函数作为参数,或者函数的返回值里面有函数,都称为高阶函数, 1,把函数作为参数传递 def dac(x,y): return x+y def tes ...

  4. Python笔记_第四篇_高阶编程_实例化方法、静态方法、类方法和属性方法概念的解析。

    1.先叙述静态方法: 我们知道Python调用类的方法的时候都要进行一个实例化的处理.在面向对象中,一把存在静态类,静态方法,动态类.动态方法等乱七八糟的这么一些叫法.其实这些东西看起来抽象,但是很好 ...

  5. Python笔记_第四篇_高阶编程_魔法(术)方法详解(重载的再详解)

    1. 魔法方法是什么? 魔法方法(Magic Method)是Python比较独特的应用,它可以给你的类增加特殊的方法,如果你的对象实现了(重载),这些方法中的某一个,就会被Python所调用.正如装 ...

  6. Python笔记_第四篇_高阶编程_再议装饰器和再议内置函数

    1. 概述: 我们在前面用了很多的装饰器这个工具的方法.这个位置要系统的讲一下装饰器. 1.2 为什么需要装饰器. 装饰器本质是一个Python函数,它可以让其他函数在不需要任何代码变动的前提下增加额 ...

  7. Python笔记_第四篇_高阶编程_正则表达式_2.正则表达式入门

    1. 匹配单个字符和数字: . --->> 匹配除换行符以外的任意字符.[0123456789] --->> []字符集合,表示匹配方括号中所包含的任意一个字符.[Thomas ...

  8. Python笔记_第四篇_高阶编程_进程、线程、协程_3.进程vs线程

    1.多任务的实现原理: 通常我们会设计Mater-Workder模式,Master负责分配任务,Worker负责执行任务,因此多任务环境下,通常是一个Master,多个Worker 2.多进程: 主进 ...

  9. Python笔记_第四篇_高阶编程_进程、线程、协程_1.进程

    1. 多任务原理: 现代操作系统,像win,max os x,linux,unix等都支持多任务. * 什么叫做多任务? 操作系统可以同时运行多个任务. * 单核CPU实现多任务原理? 操作系统轮流让 ...

随机推荐

  1. IOCTL_DISK_GET_DRIVE_GEOMETRY

    IOCTL_DISK_GET_DRIVE_GEOMETRY: 获取磁盘参数 c++实现: #include <Windows.h> #include <winioctl.h> ...

  2. laravel.url

    通过php artisan route:list 可以看到当前应用的路由情况, 在前端页面中如果要修改一个实体,需要用到实体.update,涉及的uri为实体/{实体},所用的http方法为put. ...

  3. 九十三、SAP中ALV事件之七,对自己定义的工具栏进行添加和删改

    一.我们来到工具栏页面,如果不想要某个工具栏,删掉相应的文字再双击空白就可以了 二.我们添加一个工具栏,如ZADD,双击文字 三.保存静态文本,会弹出一个功能文本框 四.填写相应的内容后,点击对勾保存 ...

  4. Essay写作如何提升自己的辩驳水平?

    辩证思维在英文写作上的表现方式有许多种,今天来讲讲Counterargument&Rebut,广泛用于英文写作和口语辩论.其作用就是通过辩驳和你论点相反的意见,来突出自己的论点更正确. 话说衡 ...

  5. 创建一个简单的Spring应用

    环境已经安装完成,接下来创建一个简单的Spring应用. 创建Spring应用步骤: 创建一个maven项目 添加spring库依赖 创建Bean类 添加Bean的xml装配文件 创建主类 运行应用程 ...

  6. win10 metasploit-framework 安装

    1.metasploit.com官网下载.msi文件(可能下载速度会很慢) 2.安装时务必关闭Windows Defender及其他杀毒软件,并在安装完成后设置metasploit文件夹为白名单 wi ...

  7. VUE中常用的一些方法

    1.获取URL中的参数 export function getUrlKey(name) { return decodeURIComponent((new RegExp('[?|&]' + na ...

  8. EL&JSTL简单介绍

    EL表达式 是为了简化咱们的jsp代码,具体一点就是为了简化在jsp里面写的那些java代码. 写法格式 ${表达式 } 如果从作用域中取值,会先从小的作用域开始取,如果没有,就往下一个作用域取. 一 ...

  9. hash表系列(转)

    http://www.cnblogs.com/mumuxinfei/p/4441826.html 前言: 我以前在百度的mentor, 在面试时特喜欢考察哈希表. 那时的我满是疑惑和不解, 觉得这东西 ...

  10. 碎碎念(DP)

    链接:https://ac.nowcoder.com/acm/contest/3006/F来源:牛客网 题目描述 在ACM比赛里,除了CE以外都是有效的提交.每一个提交都会有其评测的结果,或是AC,或 ...