博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
学习python笔记 协程
阅读量:6060 次
发布时间:2019-06-20

本文共 1152 字,大约阅读时间需要 3 分钟。

下面将一个经典的消费者和生产者的案例进行分析:

import timedef consumer():    r = ''    while True:        n = yield r        if not n:            return        print('[CONSUMER] Consuming %s...' % n)        time.sleep(1)        r = '200 OK'def produce(c):    c.next()    n = 0    while n < 5:        n = n + 1        print('[PRODUCER] Producing %s...' % n)        r = c.send(n)        print('[PRODUCER] Consumer return: %s' % r)    c.close()if __name__=='__main__':    c = consumer()    produce(c)

协程涉及函数 yield、send、next。堵塞、传递(发送)、继续

从main 开始看起,首先调用consumer(),将其返回结果给c,然后将c给produce()函数。

consumer() 函数中通过yield(阻塞),然后进行produce(c)[c代表consumer()的消息],通过c.next()恢复consumer()。将n + 1后c.send(n)发送给c,依此类推n=5时关闭。

官方解释如下:(http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0013868328689835ecd883d910145dfa8227b539725e5ed000)

注意到consumer函数是一个generator(生成器),把一个consumer传入produce后:首先调用c.next()启动生成器;然后,一旦生产了东西,通过c.send(n)切换到consumer执行;consumer通过yield拿到消息,处理,又通过yield把结果传回;produce拿到consumer处理的结果,继续生产下一条消息;produce决定不生产了,通过c.close()关闭consumer,整个过程结束。整个流程无锁,由一个线程执行,produce和consumer协作完成任务,所以称为“协程”,而非线程的抢占式多任务。

 

转载于:https://www.cnblogs.com/MiWhite/p/7086835.html

你可能感兴趣的文章
【SignalR学习系列】3. SignalR实时高刷新率程序
查看>>
ASP.NET页面刷新方法总结
查看>>
poj3615
查看>>
protect,public,private 的区别
查看>>
谈谈 jQuery 中的防冲突(noConflict)机制
查看>>
判断某元素是否在Array中
查看>>
PHP 自动生成导航网址的最佳方法 v20130826
查看>>
linux系统磁盘分区之parted
查看>>
罗杰斯:做你喜欢的工作,你会变成个有钱人
查看>>
序列化(Serialization)据为JSONP远端请求
查看>>
详解ListView加载网络图片的优化,让你轻松掌握!
查看>>
./fedora_install_oracle.sh bad interpreter
查看>>
新浪微博客户端(61)-清除图片缓存
查看>>
关于“找不到附属汇编 Microsoft.VC90.CRT,上一个错误是 参照的汇编没有安装在系统上。”的解决...
查看>>
CSS实现单行、多行文本溢出显示省略号(…)
查看>>
audio video 控制播放和停止
查看>>
linux 安装 swftools 报错
查看>>
关于asp.net C# 导出Excel文件 打开Excel文件格式与扩展名指定格式不一致的解决办法...
查看>>
传统媒体如何借力微信
查看>>
Using the Repository Pattern with ASP.NET MVC and Entity Framework
查看>>