您的位置:首页 > 编程语言 > Python开发

Python学习笔记-协程

2015-07-28 19:54 531 查看
我们都知道为了处理多个任务,我们可以用多进程跟多线程。而当进程或线程过多时系统在这些“程”之间切换就要花费很多的资源,太浪费了。这时候有一个神奇的功能可以在单一的线程间执行很多任务–这种功能叫做协程。

协程听起来高大上,实际上呢我认为就是利用生成器的一些属性,巧妙的实现了把多个线程放到一个线程里运行。

看如下的例子,是一个生产者(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生产者又接收到了消费者传过来的参数。

这样程序就实现了交替运行,好像有两个线程同时进行一样。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: