1.了解Queue

Queue是python标准库中的线程安全的队列(FIFO)实现,提供了一个适用于多线程编程的先进先出的数据结构,即队列,用来在生产者和消费者线程之间的信息传递

|queue.Queue|先进先出队列|
|queue.LifoQueue|后进先出队列|
|queue.PriorityQueue|优先级队列|
|queue.deque|双线队列|

了解python队列 https://www.cnblogs.com/itogo/p/5635629.html

----------------------------------------------------------------------------------------

2.生产者和消费者模型

生产者和消费者模型

在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。

为什么要使用生产者和消费者模式

在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程。在多线程开发当中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据。同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者。为了解决这个问题于是引入了生产者和消费者模式。

什么是生产者消费者模式

生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。

例子1

  1. # ecoding=utf-8
  2. import Queue
  3. import threading,time
  4.  
  5. q = Queue.Queue(maxsize=10)
  6. def Producer(name):
  7. count =1
  8. while True:
  9. q.put("包子 %s" % count)
  10. print "做了包子",count
  11. count +=1
  12. time.sleep(0.5)
  13. def Consumer(name):
  14. while True :
  15. print "[%s] 取到[%s] 并且吃了它..." %(name,q.get())
  16. time.sleep(1)
  17.  
  18. p = threading.Thread(target=Producer,args=("Lily",))
  19. c = threading.Thread(target=Consumer,args=("Lilei",))
  20. c1 = threading.Thread(target=Consumer,args=("Ahi",))
  21.  
  22. p.start()
  23. c.start()
  24. c1.start()

运行结果

  1. 做了包子
  2. [Lilei] 取到[包子 ] 并且吃了它...
  3. 做了包子
  4. [Ahi] 取到[包子 ] 并且吃了它...
  5. 做了包子
  6. [Lilei] 取到[包子 ] 并且吃了它...
  7. 做了包子
  8. [Ahi] 取到[包子 ] 并且吃了它...
  9. 做了包子 [Lilei] 取到[包子 ] 并且吃了它...
  10.  
  11. 做了包子 [Ahi] 取到[包子 ] 并且吃了它...
  12.  
  13. 做了包子 [Lilei] 取到[包子 ] 并且吃了它...
  14.  
  15. 做了包子
  16. [Ahi] 取到[包子 ] 并且吃了它...
  17. 做了包子
  18. [Lilei] 取到[包子 ] 并且吃了它...
  19. 做了包子
  20. [Ahi] 取到[包子 ] 并且吃了它...
  21. 做了包子
  22. [Lilei] 取到[包子 ] 并且吃了它...

例子2

  1. # ecoding=utf-8
  2. from threading import current_thread, Thread
  3. import time
  4. import random
  5. import queue
  6.  
  7. q = queue.Queue(5)
  8.  
  9. class Productor(Thread):
  10. def run(self):
  11. name = current_thread().getName()
  12. nums = range(100)
  13. while 1:
  14. nowput = random.choice(nums)
  15. if q.full(): # 消息队列满则停止生产
  16. print "队列已经达到上限{0}".format(q.qsize())
  17. time.sleep(10)
  18. q.put(nowput)
  19. print "生产者{0}生产了{1}".format(name, nowput)
  20. sl = random.choice([1, 2, 3])
  21. time.sleep(sl)
  22. print "生产者休息了{0}秒".format(sl)
  23.  
  24. class Consumer(Thread):
  25. def run(self):
  26. name = current_thread().getName()
  27. while 1:
  28. if q.empty(): # 消息队列空的时候则暂停消费
  29. print "队列空了,暂停消费"
  30. time.sleep(5)
  31. num = q.get()
  32. q.task_done()
  33. print "消费者{0}消费了{1}".format(name, num)
  34. sl = random.choice([1, 2, 3])
  35. time.sleep(sl)
  36. print "消费者休息了{0}秒".format(sl)
  37.  
  38. if __name__ == '__main__':
  39. p1 = Productor()
  40. p1.start()
  41. p2 = Productor()
  42. p2.start()
  43. c1 = Consumer()
  44. c1.start()
  45. c2 = Consumer()
  46. c2.start()
  47. c3 = Consumer()
  48. c3.start()

运行结果

  1. 生产者Thread-1生产了90
  2. 生产者Thread-2生产了61
  3. 消费者Thread-3消费了90
  4. 消费者Thread-4消费了61
  5. 队列空了,暂停消费
  6.  
  7. 消费者休息了1
  8. 队列空了,暂停消费
  9. 生产者休息了2
  10. 生产者Thread-1生产了30
  11. 消费者休息了2
  12. 消费者Thread-3消费了30
  13. 生产者休息了2
  14. 生产者Thread-2生产了15
  15. 消费者休息了1
  16. 消费者Thread-3消费了15
  17. 生产者休息了2
  18. 生产者Thread-1生产了11
  19. 生产者休息了2
  20. 生产者Thread-2生产了94
  21. 生产者休息了1
  22. 生产者Thread-1生产了18
  23. 消费者Thread-5消费了11
  24. 生产者休息了2秒消费者Thread-4消费了94
  25. 消费者休息了3
  26. 消费者Thread-3消费了18

参考了

https://blog.csdn.net/wyb199026/article/details/80788570

http://www.cnblogs.com/qing-chen/p/7684812.html

Python——Queue模块以及生产消费者模型的更多相关文章

  1. Python之queue模块以及生产消费者模型

    队列 队列类似于一条管道,元素先进先出,进put(arg),取get() 有一点需要注意的是:队列都是在内存中操作,进程退出,队列清空,另外,队列也是一个阻塞的形态. 队列分类 队列有很多中,但都依赖 ...

  2. python queue和生产者和消费者模型

    queue队列 当必须安全地在多个线程之间交换信息时,队列在线程编程中特别有用. class queue.Queue(maxsize=0) #先入先出 class queue.LifoQueue(ma ...

  3. Python - Asyncio模块实现的生产消费者模型

    [原创]转载请注明作者Johnthegreat和本文链接 在设计模式中,生产消费者模型占有非常重要的地位,这个模型在现实世界中也有很多有意思的对应场景,比如做包子的人和吃包子的人,当两者速度不匹配时, ...

  4. Python进阶----进程之间通信(互斥锁,队列(参数:timeout和block),), ***生产消费者模型

    Python进阶----进程之间通信(互斥锁,队列(参数:timeout和block),), ***生产消费者模型 一丶互斥锁 含义: ​ ​ ​ 每个对象都对应于一个可称为" 互斥锁&qu ...

  5. Python并发编程04 /多线程、生产消费者模型、线程进程对比、线程的方法、线程join、守护线程、线程互斥锁

    Python并发编程04 /多线程.生产消费者模型.线程进程对比.线程的方法.线程join.守护线程.线程互斥锁 目录 Python并发编程04 /多线程.生产消费者模型.线程进程对比.线程的方法.线 ...

  6. 多进程(了解):守护进程,互斥锁,信号量,进程Queue与线程queue(生产者与消费者模型)

    一.守护进程 主进程创建守护进程,守护进程的主要的特征为:①守护进程会在主进程代码执行结束时立即终止:②守护进程内无法继续再开子进程,否则会抛出异常. 实例: from multiprocessing ...

  7. python 并发编程 多进程 生产者消费者模型总结

    生产者消费者模型总结 生产者消费者模型什么时候用? 1.程序中有两类角色 一类负责生产数据(生产者) 一类负责处理数据(消费者) 2.引入生产者消费者模型为了解决的问题是 平衡生产者与消费者之间的速度 ...

  8. JAVA实现生产消费者模型

    前言 最近面试比较多,发现生产消费者模型在各公司面试的过程中问的还是比较多的,记录一下常见JAVA实现生产者消费模型的代码 思路 我们通过三种模式来实现 通过wait和notify 通过Lock和Co ...

  9. python Queue模块

    先看一个很简单的例子 #coding:utf8 import Queue #queue是队列的意思 q=Queue.Queue(maxsize=10) #创建一个queue对象 for i in ra ...

随机推荐

  1. 【从0到1学Web前端】CSS定位问题二(float和display的使用) 分类: HTML+CSS 2015-05-28 22:03 812人阅读 评论(1) 收藏

    display 属性规定元素应该生成的框的类型. 这个属性用于定义建立布局时元素生成的显示框类型.对于 HTML 等文档类型,如果使用 display 不谨慎会很危险,因为可能违反 HTML 中已经定 ...

  2. Android中常见的对话框

    1. 普通对话框 public void click01(View view){ AlertDialog.Builder builder = new AlertDialog.Builder(this) ...

  3. JavaScript -- Window-Move,Print

    -----035-Window-Move.html----- <!DOCTYPE html> <html> <head> <meta http-equiv=& ...

  4. 数据库设计 Step by Step (2)——数据库生命周期

    引言:数据库设计 Step by Step (1)得到这么多朋友的关注着实出乎了我的意外.这也坚定了我把这一系列的博文写好的决心.近来工作上的事务比较繁重,加之我期望这个系列的文章能尽可能的系统.完整 ...

  5. 优先队列/oriority queue 之最大优先队列的实现

    优先队列(priority queue)是一种用来维护一组数据集合S的数据结构.每一个元素都有一个相关的值,被称为关键字key. 这里以实现最大优先队列为例子 最大优先队列支持的操作如下:INSERT ...

  6. jar包运行main程序

    当把java项目打包成jar后,如何运行main函数呢? 第一种:指定运行main类: 1 java -cp test.jar com.hk.app.Application 第二种:在MANIFEST ...

  7. CustomSqlSessionFactoryBean

    import java.io.File; import java.net.JarURLConnection; import java.net.URL; import java.util.ArrayLi ...

  8. elasticSearch6源码分析(5)gateway模块

    1.gateway概述 The local gateway module stores the cluster state and shard data across full cluster res ...

  9. Vue源码之 virtual-dom 实现简析

    发现两篇写得特别好的博文,仔细通读,发现豁然开朗. 浅析Vue 中的patch和diff Vue 2.0 的 virtual-dom 实现简析

  10. WEB开发框架性能排行与趋势分析

    WEB开发框架性能基准测试解读与趋势分析 TechEmpower的<Web Framework Benchmarks>性能基准测试,是关注Web开发框架发展的重要途径.但是内容数据众多,每 ...