python 异步_Python 中由 yield 实现异步操作

本文详细解析了Python中使用yield实现异步操作的原理,通过示例代码展示了消费者和生产者如何交互,并介绍了事件循环的概念,帮助读者理解异步编程的基本流程。
摘要由CSDN通过智能技术生成

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

7ecabf7b1ce932d64581b0f146788544.png

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

第一步:

在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 中由 yield 实现异步操作

本文地址: http://www.cppcns.com/jiaoben/python/311765.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值