赤天化股票

Python 中由 yield 实现异步操作

 更新时间:2020年05月04日 11:11:40   作者:silverze   我要评论
这篇文章主要介绍了Python 中由 yield 实现异步操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

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()方法

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

第一步:

在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遍历文件目录、批量处理同类文件

    这篇文章主要为大家详细介绍了python遍历文件目录、批量处理同类文件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • Python 使用 prettytable 库打印表格美化输出功能

    Python 使用 prettytable 库打印表格美化输出功能

    这篇文章主要介绍了Python 使用 prettytable 库打印表格美化输出功能,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-12-12
  • Python面向对象编程基础解析(一)

    Python面向对象编程基础解析(一)

    这篇文章主要介绍了Python面向对象编程基础解析的相关内容,如果您想对Python编程的基础部分有所了解,这篇文章是值得一看的,需要的朋友可以参考下。
    2017-10-10
  • Python 利用邮件系统完成远程控制电脑的实现(关机、重启等)

    Python 利用邮件系统完成远程控制电脑的实现(关机、重启等)

    这篇文章主要介绍了Python 利用邮件系统完成远程控制电脑(关机、重启等),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • Python实用技巧之列表、字典、集合中根据条件筛选数据详解

    Python实用技巧之列表、字典、集合中根据条件筛选数据详解

    这篇文章主要给大家介绍了关于Python技巧之在列表、字典、集合中根据条件筛选数据的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧
    2018-07-07
  • Python实现按学生年龄排序的实际问题详解

    Python实现按学生年龄排序的实际问题详解

    这篇文章主要给大家介绍了关于Python实现按学生年龄排序实际问题的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面跟着小编来一起学习学习吧。
    2017-08-08
  • Python脚本实现代码行数统计代码分享

    Python脚本实现代码行数统计代码分享

    这篇文章主要介绍了Python脚本实现代码行数统计代码分享,本文给出了实现代码和使用方法及统计效果,需要的朋友可以参考下
    2015-03-03
  • Pytorch evaluation每次运行结果不同的解决

    Pytorch evaluation每次运行结果不同的解决

    今天小编就为大家分享一篇Pytorch evaluation每次运行结果不同的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • 初探TensorFLow从文件读取图片的四种方式

    初探TensorFLow从文件读取图片的四种方式

    本篇文章主要介绍了初探TensorFLow从文件读取图片的四种方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • python tornado微信开发入门代码

    python tornado微信开发入门代码

    这篇文章主要为大家详细介绍了python tornado微信开发入门代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08

最新评论