Python 中由 yield 实现异步操作


Posted in Python onMay 04, 2020

yield在python中初学时,觉得比较难理解。yield的作用:

①返回一个值、②接收调用者的参数

分析下面的代码:

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

def consumer():
  r = ''
  while True:
    n = yield r
    print("[Consumer] n = %d" %n)
    if not n:
      return
    print("[Consumer] consuming %s..." %n)
    r = '200 OK'

def produce(c):
  c.send(None)
  h = 0
  while h < 5:
    h = h + 1
    print("[Producer] producing %d..." %h)
    s = c.send(h)
    print("[Producer] consumer return: %s" %s)
  c.close()

c = consumer() #创建一个生成器
produce(c) #在该函数中,调用生成器的send()方法

Python 中由 yield 实现异步操作

结合程序运行过程,可分析出:

第一步:

在produce(c)函数中,调用了c.send(None)启动了生成器,遇到yield暂停;接着执行produce()中接下来的代码,从运行结果看,确实打印出了[Produce] producing 1 … 当程序运行至c.send(h)时,调用生成器并且通过yield传递了参数(h = 1)进入consumer()函数执行。

第二步:

yield传递参数(h=1)给consumer()函数中的n,并接着上一次暂停处往下继续执行,打印出[Consumer] n = 1,[Consumer] consuming 1… ;在consumer()函数中此时 r 被赋值为'200 OK',接着循环遇到yield, consumer()函数又暂停并且返回变量 r 的值,此时程序又进入produce(c)函数中接着执行。

第三步:

produce(c)函数接着第一步中c.send(h)处,继续往下执行打印出[Producer] consumer return: 200 OK,并进行循环,打印[Producer] producing 2… 后,又调用c.send(h) 。。。如此循环回到第一步!

补充知识:python asyncio模型 事件循环

异步建立在事件循环上.

简单来说事件循环:

1.把要执行的函数放入队列

2.取出函数,执行

3.看看还要不要继续放入此函数

4.继续第一步

一个简单的例子说明:

"""
  1.yield 挂起当前函数.
  2.使用调度器循环
  3.使用next唤醒此函数继续执行
"""
def f1():
  for i in range(3):
    print('f1 %d'%i)
    yield
def f2():
  for i in range(5):
    print('f2 %d' %i)
    yield
def f3():
  for i in range(10):
    print('f3 %d'%i)
    yield
#模拟一个调度器
task_q = collections.deque((f1(),f2(),f3()))
#让调度器调度这些生成器们
while task_q:
  task = task_q.popleft() #弹出首个生成器
  try:
    next(task)     #执行,如果没有异常证明此生成器还没执行完成,可以继续放入队列中
    task_q.append(task) #执行完成后,把任务继续添加到队列中.
    time.sleep(0.5)
  except StopIteration as ex:
    pass

以上这篇Python 中由 yield 实现异步操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python求算数平方根和约数的方法汇总
Mar 09 Python
Apache如何部署django项目
May 21 Python
Python面向对象编程之继承与多态详解
Jan 16 Python
Python使用requests发送POST请求实例代码
Jan 25 Python
使用Python实现微信提醒备忘录功能
Dec 04 Python
解决PyCharm控制台输出乱码的问题
Jan 16 Python
Pycharm运行加载文本出现错误的解决方法
Jun 27 Python
对django views中 request, response的常用操作详解
Jul 17 Python
Python手绘可视化工具cutecharts使用实例
Dec 05 Python
tensorflow 固定部分参数训练,只训练部分参数的实例
Jan 20 Python
python快速安装OpenCV的步骤记录
Feb 22 Python
python 实现定时任务的四种方式
Apr 01 Python
python 双循环遍历list 变量判断代码
May 04 #Python
Python求解排列中的逆序数个数实例
May 03 #Python
Python3实现个位数字和十位数字对调, 其乘积不变
May 03 #Python
python输入一个水仙花数(三位数) 输出百位十位个位实例
May 03 #Python
Python中实现输入一个整数的案例
May 03 #Python
python中使用input()函数获取用户输入值方式
May 03 #Python
Python run()函数和start()函数的比较和差别介绍
May 03 #Python
You might like
PHP Socket 编程
2010/04/09 PHP
PHP将整个网站生成HTML纯静态网页的方法总结
2012/02/05 PHP
WordPress中用于获取搜索表单的PHP函数使用解析
2016/01/05 PHP
100行PHP代码实现socks5代理服务器
2016/04/28 PHP
PHP查询大量数据内存耗尽问题的解决方法
2016/10/28 PHP
mac系统下安装多个php并自由切换的方法详解
2017/04/21 PHP
零基础php编程好学吗
2019/10/11 PHP
laravel框架邮箱认证实现方法详解
2019/11/22 PHP
JQuery 获取和设置Select选项的代码
2010/02/07 Javascript
js实现鼠标感应图片展示的方法
2015/02/27 Javascript
jQuery插件制作之参数用法实例分析
2015/06/01 Javascript
JavaScript判断微信浏览器实例代码
2016/06/13 Javascript
深入解析桶排序算法及Node.js上JavaScript的代码实现
2016/07/06 Javascript
jQuery实现的简单百分比进度条效果示例
2016/08/01 Javascript
JS对大量数据进行多重过滤的方法
2016/11/04 Javascript
jquery与js实现全选功能的区别
2017/06/11 jQuery
JavaScript canvas绘制折线图
2020/02/18 Javascript
vue项目配置使用flow类型检查的步骤
2020/03/18 Javascript
python logging类库使用例子
2014/11/22 Python
python list是否包含另一个list所有元素的实例
2018/05/04 Python
解决Python安装后pip不能用的问题
2018/06/12 Python
python设计微型小说网站(基于Django+Bootstrap框架)
2019/07/08 Python
python中selenium操作下拉滚动条的几种方法汇总
2019/07/14 Python
python实现爬虫抓取小说功能示例【抓取金庸小说】
2019/08/09 Python
python3实现将json对象存入Redis以及数据的导入导出
2020/07/16 Python
Shein英国:女性时尚网上商店
2019/04/10 全球购物
Maisons du Monde德国:法国家具和装饰的市场领导者
2019/07/26 全球购物
卫校护理专业毕业生求职信
2013/11/26 职场文书
家长会学生家长演讲稿
2013/12/29 职场文书
工作收入证明模板
2014/10/10 职场文书
2014年财务经理工作总结
2014/12/08 职场文书
2014年副班长工作总结
2014/12/10 职场文书
护士医德考评自我评价
2015/03/03 职场文书
应聘教师求职信范文
2015/03/20 职场文书
学习焦裕禄先进事迹心得体会
2016/01/23 职场文书
创业计划书之淘宝网店
2019/10/08 职场文书