1.了解Queue

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

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

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

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

2.生产者和消费者模型

生产者和消费者模型

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

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

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

什么是生产者消费者模式

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

例子1

# ecoding=utf-8
import Queue
import threading,time q = Queue.Queue(maxsize=10)
def Producer(name):
count =1
while True:
q.put("包子 %s" % count)
print "做了包子",count
count +=1
time.sleep(0.5)
def Consumer(name):
while True :
print "[%s] 取到[%s] 并且吃了它..." %(name,q.get())
time.sleep(1) p = threading.Thread(target=Producer,args=("Lily",))
c = threading.Thread(target=Consumer,args=("Lilei",))
c1 = threading.Thread(target=Consumer,args=("Ahi",)) p.start()
c.start()
c1.start()

运行结果

做了包子
[Lilei] 取到[包子 ] 并且吃了它...
做了包子
[Ahi] 取到[包子 ] 并且吃了它...
做了包子
[Lilei] 取到[包子 ] 并且吃了它...
做了包子
[Ahi] 取到[包子 ] 并且吃了它...
做了包子 [Lilei] 取到[包子 ] 并且吃了它... 做了包子 [Ahi] 取到[包子 ] 并且吃了它... 做了包子 [Lilei] 取到[包子 ] 并且吃了它... 做了包子
[Ahi] 取到[包子 ] 并且吃了它...
做了包子
[Lilei] 取到[包子 ] 并且吃了它...
做了包子
[Ahi] 取到[包子 ] 并且吃了它...
做了包子
[Lilei] 取到[包子 ] 并且吃了它...

例子2

# ecoding=utf-8
from threading import current_thread, Thread
import time
import random
import queue q = queue.Queue(5) class Productor(Thread):
def run(self):
name = current_thread().getName()
nums = range(100)
while 1:
nowput = random.choice(nums)
if q.full(): # 消息队列满则停止生产
print "队列已经达到上限{0}".format(q.qsize())
time.sleep(10)
q.put(nowput)
print "生产者{0}生产了{1}".format(name, nowput)
sl = random.choice([1, 2, 3])
time.sleep(sl)
print "生产者休息了{0}秒".format(sl) class Consumer(Thread):
def run(self):
name = current_thread().getName()
while 1:
if q.empty(): # 消息队列空的时候则暂停消费
print "队列空了,暂停消费"
time.sleep(5)
num = q.get()
q.task_done()
print "消费者{0}消费了{1}".format(name, num)
sl = random.choice([1, 2, 3])
time.sleep(sl)
print "消费者休息了{0}秒".format(sl) if __name__ == '__main__':
p1 = Productor()
p1.start()
p2 = Productor()
p2.start()
c1 = Consumer()
c1.start()
c2 = Consumer()
c2.start()
c3 = Consumer()
c3.start()

运行结果

生产者Thread-1生产了90
生产者Thread-2生产了61
消费者Thread-3消费了90
消费者Thread-4消费了61
队列空了,暂停消费 消费者休息了1秒
队列空了,暂停消费
生产者休息了2秒
生产者Thread-1生产了30
消费者休息了2秒
消费者Thread-3消费了30
生产者休息了2秒
生产者Thread-2生产了15
消费者休息了1秒
消费者Thread-3消费了15
生产者休息了2秒
生产者Thread-1生产了11
生产者休息了2秒
生产者Thread-2生产了94
生产者休息了1秒
生产者Thread-1生产了18
消费者Thread-5消费了11
生产者休息了2秒消费者Thread-4消费了94
消费者休息了3秒
消费者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. python可变对象与不可变对象的差别

    一.可变对象和不可对象 Python在heap中分配的对象分成两类:可变对象和不可对象.所谓可变对象是指,对象的内容可变,而不可变对象是指内容不可变.   不可变对象:int.string.float ...

  2. win10 关闭屏幕自动亮度

    每次切换到vsCode,再切换回桌面,屏幕总是忽暗忽亮,这谁设计的,脑残至极! 百度了好久,终于找到解决办法: 控制面板→英特尔®核芯显卡→电源→使用电池→显示器节能技术→禁用→应用 如果你按上述步骤 ...

  3. 使用binlog2sql针对mysql进行数据恢复

    MySQL闪回原理与实战 DBA或开发人员,有时会误删或者误更新数据,如果是线上环境并且影响较大,就需要能快速回滚.传统恢复方法是利用备份重搭实例,再应用去除错误sql后的binlog来恢复数据.此法 ...

  4. spring web应用

    <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...

  5. LVS专题-(3) 虚拟ip理解

    1.虚拟IP是什么? 要是单讲解虚拟 IP,理解起来很困难,所以干脆把 动态 IP .固定 IP .实体 IP 与虚拟 IP都讲解一下,加深理解和知识扩展 实体 IP:在网络的世界里,为了要辨识每一部 ...

  6. 阿里巴巴java手册示例

    package com.led.daorumysql; /** * @Description:alibaba java development manual * @author 86157 * */ ...

  7. ASP.NET MVC应用程序播放AVI视频

    前面Insus.NET实现一系列在MVC应用程序播放SWF, FLV, WMV, RM, RMVB视频.每篇使用不同的方法方式,大同小异.这篇中,为了MVC应用程序播放AVI视频,用纯M, V, C来 ...

  8. 第一个微信小程序

    微信官方已经开放微信小程序的官方文档和开发者工具.前两天都是在看相关的新闻来了解小程序该如何开发,这两天官方的文档出来之后,赶紧翻看了几眼,重点了解了一下文档中框架与组件这两个部分,然后根据简易教程, ...

  9. JS DOM操作(五) Window.docunment对象——操作元素

    定位: var a = document.getElementByIt( "id" ) 同辈元素 var b = a.nextSibling;            -- 找 a ...

  10. angularjs 2.0 简单入门1

    一:首先要写json文件,并下载所有的包 1,在任意目录下新建文件夹 命名为angular2Dome,也可以使用命令  mkdir angular2Dome 回车. 2,在angular2Dome文件 ...