使用yield和send实现简单的协程函数
使用yield和send实现协程
协程的本质是在一个线程里实现多个任务之间的来回切换,我们使用yield和send可以实现简单的协程
def pro():
print(1)
n = yield "a"
print(n)
yield "b" def con():
g = pro()
a = next(g)
print(a)
b = g.send(2)
print(b) con()
首先我们来分析一下,我们定义了两个函数:pro是生产者,con是消费者,利用yield和send可以在两个函数之间切换,send是将值传给上一个yield,然后执行pro函数的代码直到下一个yield时,又会
返回到con函数,这样就实现了两个任务之间的来回切换,具体分析间如下代码:
# def pro(): # ----第3步
# print(1) # 打印1-----第5步
# n = yield "a" # 执行等号右边的语句,把"a"的值传给next(g)这个整体(之后跳转到con函数)----第6步 # 把2的值赋给变量n---第10步
# print(n) # 打印n---第11步
# yield "b" # 执行yield "b"语句---第12步
#
#
# def con():
# g = pro() # 获取生成器-----第2步
# a = next(g) # 执行等号右边的语句(之后会跳转到pro函数)---第4步 # 把"a"是值赋给变量a-----第7步
# print(a) # 打印a----第8步
# b = g.send(2) # 执行等号右边的语句,把2发送给上一个yield----第9步 # 把"b"的值赋给变量b----第13步
# print(b) # 打印b----第14步
#
#
# con() # 执行con函数-----第1步
注意:
(1)yield、next和send左边有等号时(第3、10、12行)等号两边的语句是分开执行的,并不是yield一个值后马上把值赋给左边的变量,而是执行生成器函数,直到遇到下一个yield,再将yield的值传给这个变量
(2)yield切换也会花时间的,所以如果任务没有I/O。那么在两个任务之间切换反而会降低效率,因为每一次切换都要记录状态,在切换回来之后还要读取状态
(3)yield只能做到状态保存和状态切换,不能遇到I/O自动切换
(4)只有遇到I/O时能够自动切换,并且I/O阻塞的时间可以和执行任务代码共享这段时间,那么才真正的提高了程序的执行效率
使用yield和send实现简单的协程函数的更多相关文章
- python基础----迭代器、生成器、协程函数及应用(面向过程实例)
一.什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退) 2.可迭代 ...
- Python基础(协程函数、内置函数、递归、模块和包)-day05
写在前面 上课第五天,打卡: 凭着爱,再回首: 一.协程函数(生成器:yield的表达式形式) 1.yield 的语句形式: yield 1 - 这种方式在 Python基础(函数部分)-day04 ...
- python协程函数、递归、匿名函数与内置函数使用、模块与包
目录: 协程函数(yield生成器用法二) 面向过程编程 递归 匿名函数与内置函数的使用 模块 包 常用标准模块之re(正则表达式) 一.协程函数(yield生成器用法二) 1.生成器的语句形式 a. ...
- python协程函数应用 列表生成式 生成器表达式
协程函数应用 列表生成式 生成器表达式 一.知识点整理: 1.可迭代的:对象下有_iter_方法的都是可迭代的对象 迭代器:对象._iter_()得到的结果就是迭代器 迭代器的特性: 迭代器._n ...
- Py修行路 python基础 (十二) 协程函数应用 列表生成式 生成器表达式
一.知识点整理: 1.可迭代的:对象下有_iter_方法的都是可迭代的对象 迭代器:对象._iter_()得到的结果就是迭代器 迭代器的特性: 迭代器._next_() 取下一个值 优点: 1.提供了 ...
- python之协程函数、递归、二分法
一.协程函数: 协程函数的语法: def eater(name): print('%s说:我开动啦' %name) food_list=[] while True: food=yield food_l ...
- python基础之协程函数、列表表达式、生成器表达式
一.协程函数 协程函数的定义?如果在一个函数内部yield的使用方式是表达式形式的话,如x=yield,那么该函数称为协程函数 协程函数补充: def init(func): def wrapper( ...
- python自动化 协程函数、二分查找、模块搜索
协程函数 yiled: 把函数的执行结果封装好__iter__和__next__得到一个迭代器 与return功能类似,都可以返回值,但是return只能返回一次只 def fun(count): p ...
- python 列表表达式、生成器表达式和协程函数
列表表达式.生成器表达式和协程函数 一.列表表达式: 常规方式示例: egg_list=[] for i in range(100): egg_list.append("egg%s" ...
随机推荐
- HNOI2019 游记
HNOI2019 游记 Day 0 其实考前几天,心里还是挺慌的.结果最后 Day 0 的时候,因为种种原因反而释然了.也许是觉得,在这一步退役,也没有什么好害怕的吧. OI 本身就是一项偶然性太大的 ...
- 如何将Drawable转为Bitmap?
本文选自StackOverflow(简称:SOF)精选问答汇总系列文章之一,本系列文章将为读者分享国外最优质的精彩问与答,供读者学习和了解国外最新技术.本文将讲解如何将Drawable转为Bitmap ...
- Android 程序优化总结
第一部分 编程规范 1.1 基本要求: 程序结构清晰,简单易懂,单个函数的程序行数不得超过100行. 打算干什么,要简单,直接. 尽量使用标准库函数和公共函数 不要随意定义全局变量,尽量使用局部变量. ...
- HZNU ACM一日游 2019.3.17 【2,4,6-三硝基甲苯(TNT)】
Travel Diary 早上8:00到HG,听说hjc20032003在等我. 然后他竟然鸽我...最后还是勉强在8:30坐上去偏僻的HZNU的地铁. 到文新,然后带上fjl,打滴滴,一行人来到了H ...
- JS分页条插件
目标 制作js分页导航jq插件,用于无刷新分页或者刷新分页 实现目标参考京东和天猫的分页条. 有四个固定按钮,前页码,后页码,首页,末页. 程序关键点在于计算中间页面的起止位置.逻辑是以当前页码为参照 ...
- 51NOD1174 区间最大数 && RMQ问题(ST算法)
RMQ问题(区间最值问题Range Minimum/Maximum Query) ST算法 RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度 ...
- poj3680 Intervals (费用流)
建图((x,y,c,l)表示x到y,费用c,流量l) (S,1,0,K) (i,i+1,0,K) 这个边上的流量,表示i还可以被覆盖的次数 (N,T,0,K) (i,j,w,1)对于权值为w的区间[i ...
- cf406E Hamming Triples (推公式)
考虑某两行a和b的dis 如果相同:$|a-b|$ 如果不同:$n-|a-b|$ 然后考虑三行的dis,不妨设a>=b>=c 那么有4种情况: 1.a,b,c 0/1的种类相同:$|a-b ...
- js 获取当前时间 年月日
var datetime = new Date(); var year = datetime.getFullYear(); var month = datetime.getMonth() + 1 &l ...
- 洛谷P4248 差异
题意:求所有后缀两两之间的最长公共前缀的长度之和. 解:这道题让我发现了一个奇妙的性质:所有后缀两两最长公共前缀长度之和 和 所有前缀两两最长公共后缀之和的值是相等的,但是每一组公共前/后缀是不同的. ...