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中的进程分支fork和exec详解
Apr 11 Python
在Python中使用PIL模块对图片进行高斯模糊处理的教程
May 05 Python
Python列表和元组的定义与使用操作示例
Jul 26 Python
Python简单定义与使用二叉树示例
May 11 Python
如何优雅地处理Django中的favicon.ico图标详解
Jul 05 Python
python清除字符串前后空格函数的方法
Oct 21 Python
在python中只选取列表中某一纵列的方法
Nov 28 Python
快速解决vue.js 模板和jinja 模板冲突的问题
Jul 26 Python
python 3.74 运行import numpy as np 报错lib\site-packages\numpy\__init__.py
Oct 06 Python
pandas将多个dataframe以多个sheet的形式保存到一个excel文件中
Oct 10 Python
Python基于Tkinter开发一个爬取B站直播弹幕的工具
May 06 Python
Python中22个万用公式的小结
Jul 21 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中mt_rand()随机数函数用法
2014/11/24 PHP
PHP判断表达式中括号是否匹配的简单实例
2016/10/22 PHP
php base64 编码与解码实例代码
2017/03/21 PHP
ThinkPHP中Widget扩展的两种写法及调用方法详解
2017/05/04 PHP
JavaScript 新手24条实用建议[TUTS+]
2009/06/21 Javascript
jquery 批量上传图片实现代码
2010/01/28 Javascript
获取内联和链接中的样式(js代码)
2013/04/11 Javascript
Jquery 过滤器(first,last,not,even,odd)的使用
2014/01/22 Javascript
jquery使用animate方法实现控制元素移动
2015/03/27 Javascript
详解JavaScript中数组的相关知识
2015/07/29 Javascript
Jquery easyui 实现动态树
2015/11/17 Javascript
javascript实现倒计时跳转页面
2016/01/17 Javascript
分享12个非常实用的JavaScript小技巧
2016/05/11 Javascript
JavaScript实现的鼠标响应颜色渐变效果完整实例
2017/02/18 Javascript
浅谈React Event实现原理
2018/09/20 Javascript
vue input实现点击按钮文字增删功能示例
2019/01/29 Javascript
js实现简单的贪吃蛇游戏
2020/04/23 Javascript
9个JavaScript日常开发小技巧
2020/10/06 Javascript
[47:50]Secret vs VP 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
探索Python3.4中新引入的asyncio模块
2015/04/08 Python
在Python中使用sort()方法进行排序的简单教程
2015/05/21 Python
浅谈Python NLP入门教程
2017/12/25 Python
Python编写一个优美的下载器
2018/04/15 Python
pyqt5的QWebEngineView 使用模板的方法
2018/08/18 Python
python使用Matplotlib画条形图
2020/03/25 Python
Pycharm更换python解释器的方法
2018/10/29 Python
总结Python图形用户界面和游戏开发知识点
2019/05/22 Python
python3 线性回归验证方法
2019/07/09 Python
Python collections中的双向队列deque简单介绍详解
2019/11/04 Python
Python 没有main函数的原因
2020/07/10 Python
HTML5之SVG 2D入门7—SVG元素的重用与引用
2013/01/30 HTML / CSS
美国著名童装品牌:OshKosh B’gosh
2016/08/05 全球购物
预备党员表决心书
2014/03/11 职场文书
扬尘污染防治方案
2014/06/15 职场文书
西柏坡导游词
2015/02/05 职场文书
有关三国演义的读书笔记
2015/06/25 职场文书