Python学习笔记-协程

我们都知道为了处理多个任务,我们可以用多进程跟多线程。而当进程或线程过多时系统在这些“程”之间切换就要花费很多的资源,太浪费了。这时候有一个神奇的功能可以在单一的线程间执行很多任务–这种功能叫做协程。
协程听起来高大上,实际上呢我认为就是利用生成器的一些属性,巧妙的实现了把多个线程放到一个线程里运行。

看如下的例子,是一个生产者(produce)-消费者(consumer)模型,把两个线程(生产者,消费者)写成了协程的形式。

def consumer():
    r = ''
    while True:
        n = yield r
        print('consumer %s' % n)
        r = 'ok'
def produce(c):
    c.send(None)
    n = 0
    while n < 5:
        n = n + 1
        print('produce  %s' % n)
        r = c.send(n)
        print(r)
    c.close()
c = consumer()
produce(c)

我们来分析一下程序的执行流程。首先consumer()是一个生成器。

我们从produce函数开始,c.send(None)类似next(c)作用在于启动生成器。之后进入一个while循环开始执行生产者的功能这都很平常,直到r = c.send(n)语句,神奇的事情发生了。c.send(n)使程序转入了consumer()的执行!send中的n参数代表”yield r“这个整体。而在consumer()中有语句n = yield r这样就把生产者中的n传递给了消费者。

再来看语句r = c.send(c)其中c.send(c)是有返回值的,该值就是下一个yield后面面跟的参数,如语句n = yield r中”r“就是返回值。这样通过yield生产者又接收到了消费者传过来的参数。
这样程序就实现了交替运行,好像有两个线程同时进行一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值