主要内容:
- 小目标:理解Python中的协程
- 主要内容:协程与异步,生产者与消费者
如果看完这篇文章,你还是弄不明白协程,
你来找我,我保证不打你,我给你发100的大红包。
理解协程,先来看生成器对象相关方法:
1. 生成器对象方法
方法说明:
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这是其中一种
生产者与消费者
一个例子:厂家生产商品,用户购买商品,
厂家生产多,消费者消费慢,造成产品积压;
厂家生产慢,消费者消费快,产品供应不足;
生产者与消费者模型:平衡生产者与消费者工作能力,提高数据处理消费能力。
理想状态:生产者与消费者的生产能力与消费能力平衡;
具体例子:
#消费者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);
- 理解生产者与消费者调用关系;