生产者消费者代码_python笔记25:yield实现-协程,生产者与消费者模型

主要内容:

  • 小目标:理解Python中的协程
  • 主要内容:协程与异步,生产者与消费者

如果看完这篇文章,你还是弄不明白协程,

你来找我,我保证不打你,我给你发100的大红包。

理解协程,先来看生成器对象相关方法:

1. 生成器对象方法

方法说明:

ac1614a56b3ef8294ba21a244c91af50.png

生成器方法

2. 生成器返回指定的值

需求:生成器传入字符串,返回字符串对应的数字

def genFunc():    x = None    while True:        print("call yield x=", x)        v = yield x        x = int(v)

调用过程: 第一次:创建生成器,并执行一次

gen = genFunc()next(gen)

结果:

call yield x= None

第二次:

value = gen.send('10')print(value)

结果:

call yield x= 1010

分析:

1.调用者每次send之后,当前执行语句等待send的返回;

2.生成器函数收到消息,执行代码,遇到yield返回,并保存上下文;

3.调用者接收生成器send返回的值,继续执行其他语句;

python中,我们将这种情况称为协程。

协程:

基本概念:

1.协程是一种用户态的轻量级线程 ;

2.必须在只有一个单线程里实现并发;

3.修改共享数据不需加锁 ;

4.用户程序里自己保存多个控制流的上下文栈;

5.某个协程遇到IO操作自动切换到其它协程;

上一个例子执行过程:调用者为A,生成器为B

1.协程A使用next(B);

2.协程B开始执行,遇到yield,返回并切换到协程A;

3.协程A执行代码,调用send方法,切换到协程B;

4.重复上面过程

Python中有多种方式实现协程,yield这是其中一种

生产者与消费者

一个例子:厂家生产商品,用户购买商品,

厂家生产多,消费者消费慢,造成产品积压;

厂家生产慢,消费者消费快,产品供应不足;

生产者与消费者模型:平衡生产者与消费者工作能力,提高数据处理消费能力。

理想状态:生产者与消费者的生产能力与消费能力平衡;

424f830eef3cf2200ef6de1872a8124a.png

生产者与消费者

具体例子:

#消费者def customer():    r=""    while True:        #等待接受生产者消息        n=yield r        print("customer receive:",n)        r=f'recv {n}'#生产者def produce(c):    #必须调用生成器    c.send(None)    #生产5个产品    for i in range(6):        print("send %d to customer"%i)        #向消费者发送消息i        r=c.send(i)        print("receive customer",r)c=customer()produce(c)

结果:

send 0 to customercustomer receive: 0receive customer recv 0send 1 to customer...send 5 to customercustomer receive: 5receive customer recv 5

以上就是使用yield实现生产者与消费者模型。

总结:

  • 生成器实现协程,根据要求先调用gen.send()或者next(gen);
  • 理解生产者与消费者调用关系;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值