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的框架中一些会话程序的管理
Apr 20 Python
python采集百度百科的方法
Jun 05 Python
python 二分查找和快速排序实例详解
Oct 13 Python
Python使用win32com模块实现数据库表结构自动生成word表格的方法
Jul 17 Python
我喜欢你 抖音表白程序python版
Apr 07 Python
Python Web框架之Django框架文件上传功能详解
Aug 16 Python
vscode 配置 python3开发环境的方法
Sep 19 Python
python多进程并发demo实例解析
Dec 13 Python
运行python提示no module named sklearn的解决方法
Nov 29 Python
Python实现随机爬山算法
Jan 29 Python
python 批量压缩图片的脚本
Jun 02 Python
Python实现批量自动整理文件
Mar 16 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为什么选mysql作为数据库? Mysql 创建用户方法
2007/07/02 PHP
PHP正则表达式 /i, /is, /s, /isU等介绍
2014/10/23 PHP
php短信接口代码
2016/05/13 PHP
PHP中时间加减函数strtotime用法分析
2017/04/26 PHP
JSON扫盲帖 JSON.as类教程
2009/02/16 Javascript
ajax 文件上传应用简单实现
2009/03/03 Javascript
onsubmit阻止form表单提交与onclick的相关操作
2010/09/03 Javascript
js中获取事件对象的方法小结
2011/03/13 Javascript
用js实现输入提示(自动完成)的实例代码
2013/06/14 Javascript
jquery让指定的元素闪烁显示的方法
2015/03/17 Javascript
JS+CSS实现带小三角指引的滑动门效果
2015/09/22 Javascript
跟我学习javascript的arguments对象
2015/11/16 Javascript
js动态获取子复选项并设计全选及提交的实现方法
2016/06/24 Javascript
微信小程序-拍照或选择图片并上传文件
2017/01/06 Javascript
jquery 手势密码插件
2017/03/17 Javascript
移动端利用H5实现压缩图片上传功能
2017/03/29 Javascript
JS实现对json对象排序并删除id相同项功能示例
2018/04/18 Javascript
Vue.js 时间转换代码及时间戳转时间字符串
2018/10/16 Javascript
「中高级前端面试」JavaScript手写代码无敌秘籍(推荐)
2019/04/08 Javascript
解决echarts中横坐标值显示不全(自动隐藏)问题
2020/07/20 Javascript
vue实现简易图片左右旋转,上一张,下一张组件案例
2020/07/31 Javascript
Vue 实现拨打电话操作
2020/11/16 Javascript
[03:17]2016完美“圣”典风云人物:冷冷专访
2016/12/08 DOTA
python实现代码行数统计示例分享
2014/02/10 Python
Python基于matplotlib绘制栈式直方图的方法示例
2017/08/09 Python
python读取和保存视频文件
2018/04/16 Python
Python 普通最小二乘法(OLS)进行多项式拟合的方法
2018/12/29 Python
Python使用Pyqt5实现简易浏览器(最新版本测试过)
2020/04/27 Python
HTML5实现分享到微信好友朋友圈QQ好友QQ空间微博二维码功能
2018/01/03 HTML / CSS
朗仕(Lab series)英国官网:雅诗兰黛集团男士专属护肤品牌
2017/11/28 全球购物
化石印度尼西亚在线商店:Fossil Indonesia
2019/03/11 全球购物
将时尚融入珠宝:Adornmonde
2019/10/17 全球购物
企业文化宣传标语
2014/06/09 职场文书
化工专业求职信
2014/07/01 职场文书
民主生活会对照检查材料范文
2014/10/01 职场文书
三峡人家导游词
2015/01/31 职场文书