Python语言中的协程(生产者-消费者举例)
来源:互联网 发布:华为mate10抢购软件 编辑:程序博客网 时间:2024/06/01 09:24
协程又被称为微线程,它的特点是不需要进行线程的切换,因为整个程序的执行过程中,只有一个线程.没有线程切换的开销,和多线程相比较,线程数量越多,协程的性能就越高.它子程序的执行是由程序自身控制.又由于只存在一个线程,所以不存在什么变量共享等冲突问题,也不存在锁机制,更不会出现死锁的情况.这样一来,执行效率就比多线程高的多.为了有效利用多核CPU,我们可以用进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能。
看例子:
传统的生产者-消费者模型是一个线程写消息,一个线程取消息,通过锁机制控制队列和等待,但一不小心就可能死锁。
如果改用协程,生产者生产消息后,直接通过yield跳转到消费者开始执行,待消费者执行完毕后,切换回生产者继续生产,效率极高:
# 注意 变成generator的函数,在首次调用的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行def consumer(): r = '' print('lalalalalaal') # 只有第一次会执行(启动生成器), 之后再调用生成器就会从yield处执行 while True: n = yield r # 再次执行时从这里的yield继续执行, 将把produce传入的参数 n 赋给局部变量 n . 下轮循环再次遇到yield就会就将 r 返回给produce函数 # 所以Python的yield不但可以返回一个值,它还可以接收调用者发出的参数 print('xxxxxlalalalalaal') # 由于生成器在启动的时候遇到上面的yield就返回了, 所以第一次不会执行这条语句. 之后每次都会被执行 if not n: return print('[CONSUMER] Consuming %s...' % n) r = '200 OK' # 因为yield r 所以这个r会在下一次循环被返回给produce函数 a = 'fake 200 OK' # 返回的值与a无关def produce(c): c.send(None) print('babababab') n = 0 while n < 5: n = n + 1 print('[PRODUCER] Producing %s...' % n) r = c.send(n) # # 获取生成器consumer中由yield语句返回的下一个值 print('[PRODUCER] Consumer return: %s' % r) c.close()c = consumer() # 并不会启动生成器, 只是将c变为一个生成器print('AaAaAaAaAa') # AaAaAaAaAaproduce(c)# =># AaAaAaAaAa# lalalalalaal# babababab# [PRODUCER] Producing 1...# xxxxxlalalalalaal# [CONSUMER] Consuming 1...# [PRODUCER] Consumer return: 200 OK# [PRODUCER] Producing 2...# xxxxxlalalalalaal# [CONSUMER] Consuming 2...# [PRODUCER] Consumer return: 200 OK# [PRODUCER] Producing 3...# xxxxxlalalalalaal# [CONSUMER] Consuming 3...# [PRODUCER] Consumer return: 200 OK# [PRODUCER] Producing 4...# xxxxxlalalalalaal# [CONSUMER] Consuming 4...# [PRODUCER] Consumer return: 200 OK# [PRODUCER] Producing 5...# xxxxxlalalalalaal# [CONSUMER] Consuming 5...# [PRODUCER] Consumer return: 200 OK
生成器generator这里面的yield不但可以返回一个值,它还可以接收调用者发出的参数.首先等待生产者发出send()调用的参数,执行子程序,再通过yield返回参数到生产者,生产者继续生产,消费者子程序等待传来参数,以此循环往复,直到生产者停止生产...
0 0
- Python语言中的协程(生产者-消费者举例)
- Python中的生产者消费者问题
- Python中的生产者消费者问题
- PYthon中的生产者和消费者问题
- python中的生产者以及消费者实现
- python中的生产者与消费者模式
- Python中的生产者与消费者 实现多线程
- Python中的生产者与消费者模式
- Java生产者消费者模式举例
- Python的yield协程机制实现生产者-消费者模式
- Python实现协程的生产者与消费者
- Python 生产者消费者--队列实现
- 生产者与消费者模式(python 版)
- python 生产者消费者示例
- python生产者/消费者示例
- python 生产者和消费者
- python生产者消费者模型
- 线程通信举例——生产者、消费者
- 线程wait( )、sleep( )、notify( )方法
- 聊一聊监听器
- 每天一整理-java设计模式之builder模式
- 70%的人离职因领导这4宗罪
- 使用STL模板必须重载的运算符
- Python语言中的协程(生产者-消费者举例)
- 蓝桥杯 基础练习 特殊回文数 JAVA
- [leetcode]: 500. Keyboard Row
- Oracle Mobile Web Application (MWA) 学习小结(1)
- 网络端口大全
- Visio2010建立ER图并直接导出为SQL语句
- 这样读源码,不牛X也难
- 什么时候需要透析
- POJ.1995 Raising Modulo Numbers (快速幂)