好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

python笔记26_协程

主要内容:

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

如果看完这篇文章,你还是弄不明白协程, 你来找我,我保证不打你,我给你发100的大红包。

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

1. 生成器对象方法

方法 说明 send(arg) 向生成器函数发送消息,返回生成器对象或者异常 close() 关闭生成器

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= 10
10 

分析执行过程:我们分两个角色,如下图:

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 customer
customer receive: 0
receive customer recv 0
send 1 to customer
...
send 5 to customer
customer receive: 5
receive customer recv 5 

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

总结:

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

查看更多关于python笔记26_协程的详细内容...

  阅读:20次