Python学习笔记-协程

来源:互联网 发布:专业数据恢复公司 编辑:程序博客网 时间:2024/04/29 03:37

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

看如下的例子,是一个生产者(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生产者又接收到了消费者传过来的参数。
这样程序就实现了交替运行,好像有两个线程同时进行一样。

0 0
原创粉丝点击