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

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协作完成任务,所以称为“协程”,而非线程的抢占式多任务。

最新文章

  1. Microsoft Dynamics CRM 2013 的相关更新 2013-12
  2. Android自动化测试工具——monkey简介及入门
  3. virtualbox 在window10上的兼容性调整
  4. Centering HTML elements larger than their parents
  5. CSS3 Animation 基于 less 构建的 css3 动画库
  6. no such partition grub rescue&gt;
  7. Python:如何得到Popen的输出?
  8. code testing
  9. Spark里面:获取图Spark有多少行代码
  10. 一个java解析xml的简单例子
  11. vue-router2.x
  12. HTTP请求过程(http是一种无状态协议,即不建立持久的连接)
  13. java8 - IO
  14. 借助TZImagePickerController三方库理解自定义相册
  15. BZOJ_3261_最大异或和_可持久化trie
  16. mapreduce map 的个数
  17. Go 的构建模式
  18. BZOJ3714 PA2014 Kuglarz 最小生成树
  19. win10安装tensorflow-gpu
  20. 推荐十款java开源中文分词组件

热门文章

  1. DecimalFormat格式化十进制数字
  2. centos7下 svn的配置
  3. 理论铺垫:阻塞IO、非阻塞IO、IO多路复用/事件驱动IO(单线程高并发原理)、异步IO
  4. 【Python 11】汇率兑换4.0(函数)
  5. 如何在查看docker container内进程信息,与宿主机上进程信息的映射关系
  6. Parallel 类并行任务(仅仅当执行耗时操作时,才有必要使用)
  7. 迄今为止 .Net 平台功能最强大,性能最佳的 JSON 序列化和反序列化库。
  8. .netcore mvc docker环境jenkins一键部署(DevOps)
  9. Spring表达式语言SpEL
  10. vue-electron脚手架安装及说明 打包基于Vue的 桌面应用程序