python yield实现协程(生产者-消费者)
2024-09-05 06:04:59
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
跳转到消费者开始执行,待消费者执行完毕后,切换回生产者继续生产,效率极高
最新文章
- centos 7 下安装Nginx
- batch批的概念
- mismatch位置(MD tag)- sam/bam格式解读进阶
- 使用vxsim(一)
- Qt 学习之路 :Repeater
- javascript 计算中文字符长度
- hdu5269 ZYB loves Xor I
- tomcat替换.class文件并没有生效的原因(失效原因)(转)
- 【洛谷P4555】最长双回文串
- BZOJ 3669 魔法森林
- windows下使用git和github建立远程仓库
- std::array中的std::get<;n>;()
- springboot2 config_toolkit 并且设置全局获取数据GlobalUtil
- VS2013配置OPENCV2.4.9
- javascript中NAN undefined 和null
- 【Python】多线程-3
- python 自然语言处理库https://www.nltk.org/nltk_data/
- MyEclipse总是quick update解决办法
- C# 关于out和ref的问题
- jQuery中的ajax用法案例