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分割和拼接字符串
Nov 01 Python
详解Python的单元测试
Apr 28 Python
机器学习python实战之决策树
Nov 01 Python
Tensorflow 合并通道及加载子模型的方法
Jul 26 Python
python连接mongodb密码认证实例
Oct 16 Python
python对绑定事件的鼠标、按键的判断实例
Jul 17 Python
python GUI库图形界面开发之PyQt5工具栏控件QToolBar的详细使用方法与实例
Feb 28 Python
深入浅析Python 命令行模块 Click
Mar 11 Python
使用pycharm和pylint检查python代码规范操作
Jun 09 Python
python 实现围棋游戏(纯tkinter gui)
Nov 13 Python
python在协程中增加任务实例操作
Feb 28 Python
pandas取dataframe特定行列的实现方法
May 24 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之APC缓存详细介绍 apc模块安装
2014/01/13 PHP
递归删除一个节点以及该节点下的所有节点示例
2014/03/19 PHP
php使用fputcsv()函数csv文件读写数据的方法
2015/01/06 PHP
PHP中使用正则表达式提取中文实现笔记
2015/01/20 PHP
用PHP生成excel文件到指定目录
2015/06/22 PHP
thinkPHP实现将excel导入到数据库中的方法
2016/04/22 PHP
彻底搞懂JS无缝滚动代码
2007/01/03 Javascript
js有关元素内容操作小结
2011/12/20 Javascript
addEventListener()第三个参数useCapture (Boolean)详细解析
2013/11/07 Javascript
使用JS实现jQuery的addClass, removeClass, hasClass函数功能
2014/10/31 Javascript
Javascript实现网络监测的方法
2015/07/31 Javascript
Vue.js bootstrap前端实现分页和排序
2017/03/10 Javascript
JS实现的点击表头排序功能示例
2017/03/27 Javascript
vue组件实现文字居中对齐的方法
2017/08/23 Javascript
浅谈Vuex@2.3.0 中的 state 支持函数申明
2017/11/22 Javascript
laypage.js分页插件使用方法详解
2019/07/27 Javascript
vue 公共列表选择组件,引用Vant-UI的样式方式
2020/11/02 Javascript
[01:31:02]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第一场
2019/08/22 DOTA
深入理解python中的atexit模块
2017/03/07 Python
windows环境下tensorflow安装过程详解
2018/03/30 Python
Python绘制堆叠柱状图的实例
2019/07/09 Python
python打印n位数“水仙花数”(实例代码)
2019/12/25 Python
tensorflow入门:tfrecord 和tf.data.TFRecordDataset的使用
2020/01/20 Python
Python控制鼠标键盘代码实例
2020/12/08 Python
VICHY薇姿美国官方网站:欧洲药房第一的抗衰老品牌
2017/11/22 全球购物
美国在线面料商店:Online Fabric Store
2018/07/26 全球购物
美国和加拿大计算机和电子产品购物网站:TigerDirect.com
2019/09/13 全球购物
俄罗斯电子产品在线商店:UltraTrade
2020/01/30 全球购物
波兰办公用品和学校用品在线商店:Dlabiura24.pl
2020/11/18 全球购物
法学院方阵解说词
2014/01/29 职场文书
小学信息技术教学反思
2014/02/10 职场文书
婚礼答谢宴主持词
2014/03/14 职场文书
真诚的求职信
2014/07/04 职场文书
八一建军节演讲稿
2014/09/10 职场文书
2015年高三班主任工作总结
2015/05/21 职场文书
2015年基建工作总结范文
2015/05/23 职场文书