Python学习笔记-协程
2015-07-28 19:54
531 查看
我们都知道为了处理多个任务,我们可以用多进程跟多线程。而当进程或线程过多时系统在这些“程”之间切换就要花费很多的资源,太浪费了。这时候有一个神奇的功能可以在单一的线程间执行很多任务–这种功能叫做协程。
协程听起来高大上,实际上呢我认为就是利用生成器的一些属性,巧妙的实现了把多个线程放到一个线程里运行。
看如下的例子,是一个生产者(produce)-消费者(consumer)模型,把两个线程(生产者,消费者)写成了协程的形式。
我们来分析一下程序的执行流程。首先consumer()是一个生成器。
我们从produce函数开始,
再来看语句
这样程序就实现了交替运行,好像有两个线程同时进行一样。
协程听起来高大上,实际上呢我认为就是利用生成器的一些属性,巧妙的实现了把多个线程放到一个线程里运行。
看如下的例子,是一个生产者(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生产者又接收到了消费者传过来的参数。
这样程序就实现了交替运行,好像有两个线程同时进行一样。
相关文章推荐
- 机器学习-CrossValidation交叉验证Python实现
- [转载] Python的GIL是什么鬼,多线程性能究竟如何
- Python学习笔记-生成器
- python的字符序列处理
- python时间函数和常用格式化
- Python在windows下的安装与配置
- Python 学习笔记13:Python + wsgi + django 配置。坑爹的python3和wsgi不兼容的解决
- Parallel Python——一个简单的分布式计算系统
- python基础教程总结15——5 虚拟茶话会
- Python操作Word批量生成文章的方法
- python 问题调试1
- Python什么是值或引用函数参数
- Python 之 获取聚类中心与其支撑点的方法
- 90 行 Python 搭一个音乐搜索工具
- 一个简单的python连接池,以及DBUtil.PooledDB的使用
- [译]Python编写虚拟解释器
- python使用win32com的心得
- python 之queue
- Python 练习册,每天一个小程序
- 如何修改python IDLE代码及语法主题 配色——拷贝的是别人喜欢的,来学会调试自己喜欢的颜色吧