学习python笔记 协程
2024-10-09 18:53:17
下面将一个经典的消费者和生产者的案例进行分析:
import time def 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协作完成任务,所以称为“协程”,而非线程的抢占式多任务。
最新文章
- Microsoft Dynamics CRM 2013 的相关更新 2013-12
- Android自动化测试工具——monkey简介及入门
- virtualbox 在window10上的兼容性调整
- Centering HTML elements larger than their parents
- CSS3 Animation 基于 less 构建的 css3 动画库
- no such partition grub rescue>;
- Python:如何得到Popen的输出?
- code testing
- Spark里面:获取图Spark有多少行代码
- 一个java解析xml的简单例子
- vue-router2.x
- HTTP请求过程(http是一种无状态协议,即不建立持久的连接)
- java8 - IO
- 借助TZImagePickerController三方库理解自定义相册
- BZOJ_3261_最大异或和_可持久化trie
- mapreduce map 的个数
- Go 的构建模式
- BZOJ3714 PA2014 Kuglarz 最小生成树
- win10安装tensorflow-gpu
- 推荐十款java开源中文分词组件
热门文章
- DecimalFormat格式化十进制数字
- centos7下 svn的配置
- 理论铺垫:阻塞IO、非阻塞IO、IO多路复用/事件驱动IO(单线程高并发原理)、异步IO
- 【Python 11】汇率兑换4.0(函数)
- 如何在查看docker container内进程信息,与宿主机上进程信息的映射关系
- Parallel 类并行任务(仅仅当执行耗时操作时,才有必要使用)
- 迄今为止 .Net 平台功能最强大,性能最佳的 JSON 序列化和反序列化库。
- .netcore mvc docker环境jenkins一键部署(DevOps)
- Spring表达式语言SpEL
- vue-electron脚手架安装及说明 打包基于Vue的 桌面应用程序