Python之queue模块以及生产消费者模型
队列
队列类似于一条管道,元素先进先出,进put(arg),取get()
有一点需要注意的是:队列都是在内存中操作,进程退出,队列清空,另外,队列也是一个阻塞的形态.
队列分类
队列有很多中,但都依赖模块queue
| 队列方式 | 特点 |
|---|---|
| queue.Queue | 先进先出队列 |
| queue.LifoQueue | 后进先出队列 |
| queue.PriorityQueue | 优先级队列 |
| queue.deque | 双线队列 |
队列的方法
| 方法 | 用法说明 |
|---|---|
| put | 放数据,Queue.put()默认有block=True和timeout两个参数。当block=True时,写入是阻塞式的,阻塞时间由timeout确定。当队列q被(其他线程)写满后,这段代码就会阻塞,直至其他线程取走数据。Queue.put()方法加上 block=False 的参数,即可解决这个隐蔽的问题。但要注意,非阻塞方式写队列,当队列满时会抛出 exception Queue.Full 的异常 |
| get | 取数据(默认阻塞),Queue.get([block[, timeout]])获取队列,timeout等待时间 |
| empty | 如果队列为空,返回True,反之False |
| qsize | 显示队列中真实存在的元素长度 |
| maxsize | 最大支持的队列长度,使用时无括号 |
| join | 实际上意味着等到队列为空,再执行别的操作 |
| task_done | 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号 |
| full | 如果队列满了,返回True,反之False |
单向队列
import queue
q=queue.Queue(5) #如果不设置长度,默认为无限长
print(q.maxsize) #注意没有括号
q.put(123)
q.put(456)
q.put(789)
q.put(100)
q.put(111)
q.put(233)
print(q.get())
print(q.get())
如此打印时候是阻塞的,为什么呢,因为创建了5个元素长度的队列,但我put进去了6个,所以就阻塞了.如果少写一个能显示出正确的123.
后进先出队列
q = queue.LifoQueue()
q.put(12)
q.put(34)
print(q.get())
优先级队列
需要注意的是,优先级队列put的是一个元组,(优先级,数据),优先级数越小,级别越高
q = queue.PriorityQueue()
q.put((3,'aaaaa'))
q.put((3,'bbbbb'))
q.put((1,'ccccc'))
q.put((3,'ddddd'))
print(q.get())
print(q.get())
out:
(1, 'ccccc')
(3, 'aaaaa')
双线队列
q = queue.deque()
q.append(123)
q.append(456)
q.appendleft(780)
print(q.pop())
print(q.popleft())
out:
456
780
生产消费者模型
解决什么问题,使用场景
从下面图中可以发现生产者和消费者之间用中间类似一个队列一样的东西串起来。这个队列可以想像成一个存放产品的“仓库”,生产者只需要关心这个“仓库”,并不需要关心具体的消费者,对于生产者而言甚至都不知道有这些消费者存在。对于消费者而言他也不需要关心具体的生产者,到底有多少生产者也不是他关心的事情,他只要关心这个“仓库”中还有没有东西。这种模型是一种松耦合模型。这样可以回答我上面提出的第一个问题。这个模型的产生就是为了复用和解耦。比如常见的消息框架(非常经典的一种生产者消费者模型的使用场景)ActiveMQ。发送端和接收端用Topic进行关联。这个Topic可以理解为我们这里“仓库”的地址,这样就可以实现点对点和广播两种方式进行消息的分发。

一句话总结
解决程序解耦,较少的资源解决高并发的问题
import queue,threading,time
q=queue.Queue()
def product(arg):
while True:
q.put(str(arg)+'包子')
def consumer(arg):
while True:
print(arg,q.get())
time.sleep(2)
for i in range(3):
t=threading.Thread(target=product,args=(i,))
t.start()
for j in range(20):
t=threading.Thread(target=consumer,args=(j,))
t.start()
Python之queue模块以及生产消费者模型的更多相关文章
- Python——Queue模块以及生产消费者模型
1.了解Queue Queue是python标准库中的线程安全的队列(FIFO)实现,提供了一个适用于多线程编程的先进先出的数据结构,即队列,用来在生产者和消费者线程之间的信息传递 |queue.Qu ...
- python操作rabbitmq,实现生产消费者模型
更多详情参考官方文档:https://www.rabbitmq.com/tutorials/tutorial-six-python.html 参考博客:https://blog.csdn.net/we ...
- Python - Asyncio模块实现的生产消费者模型
[原创]转载请注明作者Johnthegreat和本文链接 在设计模式中,生产消费者模型占有非常重要的地位,这个模型在现实世界中也有很多有意思的对应场景,比如做包子的人和吃包子的人,当两者速度不匹配时, ...
- Python进阶----进程之间通信(互斥锁,队列(参数:timeout和block),), ***生产消费者模型
Python进阶----进程之间通信(互斥锁,队列(参数:timeout和block),), ***生产消费者模型 一丶互斥锁 含义: 每个对象都对应于一个可称为" 互斥锁&qu ...
- Python并发编程04 /多线程、生产消费者模型、线程进程对比、线程的方法、线程join、守护线程、线程互斥锁
Python并发编程04 /多线程.生产消费者模型.线程进程对比.线程的方法.线程join.守护线程.线程互斥锁 目录 Python并发编程04 /多线程.生产消费者模型.线程进程对比.线程的方法.线 ...
- Python队列queue模块
Python中queue模块常用来处理队列相关问题 队列常用于生产者消费者模型,主要功能为提高效率和程序解耦 1. queue模块的基本使用和相关说明 # -*- coding:utf-8 -*- # ...
- 多进程(了解):守护进程,互斥锁,信号量,进程Queue与线程queue(生产者与消费者模型)
一.守护进程 主进程创建守护进程,守护进程的主要的特征为:①守护进程会在主进程代码执行结束时立即终止:②守护进程内无法继续再开子进程,否则会抛出异常. 实例: from multiprocessing ...
- Python中Queue模块及多线程使用
Python的Queue模块提供一种适用于多线程编程的FIFO实现.它可用于在生产者(producer)和消费者(consumer)之间线程安全(thread-safe)地传递消息或其它数据,因此多个 ...
- JAVA实现生产消费者模型
前言 最近面试比较多,发现生产消费者模型在各公司面试的过程中问的还是比较多的,记录一下常见JAVA实现生产者消费模型的代码 思路 我们通过三种模式来实现 通过wait和notify 通过Lock和Co ...
随机推荐
- 哈希表(python)
# -*- coding: utf-8 -*- class Array(object): def __init__(self, size=32, init=None): self._size = si ...
- WCF之MSMQ消息队列
一.MSMQ简介 MSMQ(微软消息队列)是Windows操作系统中消息应用程序的基础,是用于创建分布式.松散连接的消息通讯应用程序的开发工具. MSMQ与XML Web Services和.Net ...
- vmware 共享文件夹不显示文件的问题
上海SEO:安装vmtools后还是不显示执行以下操作//但是只有root权限才行 1:输入命令 sudo apt install open-vm-tools 安装工具2:输入命令 sudo vmh ...
- 安装pip的三种方式
pip是python的一个工具,用来安装python包特别方便.Linux系统是是内置python程序,因为许多Linux内置文件都是使用python来编写的,比如说yum. 1.脚本安装 通过脚本的 ...
- [Javascript] Construct a Regex to Match Twitter Mentions with Regexr
regexr is a powerful tool for debugging existing regexes and creating new ones. In this lesson, we'l ...
- javascript权威指南第12章DOM2 DOM3 示例代码
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <title> Example XHTML ...
- git查看commit提交记录详情
相关的命令: git log:查看所有的commit提交记录: git show: 查看提交的详情: 首先,需要通过git log打印所有commit记录,例如: 1.查看最新的commit:git ...
- /dev/null和/dev/zero的作用
经常会看到dd命令用到/dev/zero文件,这里总结一下/dev/null和/dev/zero的作用和使用实例. 在类Unix系统(包括Linux)中,/dev/null 它是空设备,也称为位桶(b ...
- exam9.6&&7
emmm 改题稍紧张,以后几篇并一起写 9.6 (前十并没有参加本次考试) 于是我就rank8了 一道题一道题来 先说T1: 显然是一个高精度GCD,于是打算用计算器算一下时间复杂度 众所周知gcd是 ...
- Word 有哪些神奇的功能?
作者:秦阳链接:https://www.zhihu.com/question/27035859/answer/621742048来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...