def customer():
r=""
while True:
n=yield r#,接收生产者的消息,并向消费者发送r
print("customer receive",n)
r="ok" def produce(c):
c.send(None)#第一次启动协程必须发送None值,否则报如下错误
#TypeError: can't send non-None value to a just-started generator
for i in range():
print("start send to customer",i)
r=c.send(i)#向消费者发送值
print("receive customer",r) c=customer()
produce(c)
start send to customer
customer receive
receive customer ok
start send to customer
customer receive
receive customer ok
start send to customer
customer receive
receive customer ok
start send to customer
customer receive
receive customer ok
start send to customer
customer receive
receive customer ok
start send to customer
customer receive
receive customer ok

简单的生产者-消费者模型就这样生成了!

yield不仅可以yield r发送数据,还可以接收数据n=yield,或者同时接收并发送数据n=yield r接收n发送r

传统的生产者-消费者模型是一个线程写消息,一个线程取消息,通过锁机制控制队列和等待,但一不小心就可能死锁。

如果改用协程,生产者生产消息后,直接通过yield跳转到消费者开始执行,待消费者执行完毕后,切换回生产者继续生产,效率极高

最新文章

  1. centos 7 下安装Nginx
  2. batch批的概念
  3. mismatch位置(MD tag)- sam/bam格式解读进阶
  4. 使用vxsim(一)
  5. Qt 学习之路 :Repeater
  6. javascript 计算中文字符长度
  7. hdu5269 ZYB loves Xor I
  8. tomcat替换.class文件并没有生效的原因(失效原因)(转)
  9. 【洛谷P4555】最长双回文串
  10. BZOJ 3669 魔法森林
  11. windows下使用git和github建立远程仓库
  12. std::array中的std::get<n>()
  13. springboot2 config_toolkit 并且设置全局获取数据GlobalUtil
  14. VS2013配置OPENCV2.4.9
  15. javascript中NAN undefined 和null
  16. 【Python】多线程-3
  17. python 自然语言处理库https://www.nltk.org/nltk_data/
  18. MyEclipse总是quick update解决办法
  19. C# 关于out和ref的问题
  20. jQuery中的ajax用法案例

热门文章

  1. EventBus原理解析
  2. ABA问题的产生及解决
  3. GitHub的高级搜索功能
  4. Web应急:网站被批量挂黑页
  5. 关于 Visual Studio 2017 ,或2019 ,Installer 没检测到已安装的程序.以及C++ 创建项目失败
  6. 我是如何一步步编码完成万仓网ERP系统的(五)产品库设计 1.产品类别
  7. C#实现UrlEncode (URL编码)
  8. 《EOPL》 : CPS风格真是神奇
  9. Python笔记:装饰器
  10. 极速体验docker容器健康