添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/brucewong0516/article/details/84025027

一、队列的定义

队列类似于一条管道,元素先进先出,进 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。

import queue
q=queue.Queue(5)    #如果不设置长度,默认为无限长
print(q.maxsize)    #注意没有括号
q.put(123)
q.put(456)
q.put(789)
q.put(100)
q.put(111)
print(q.get())
print(q.get())
-----------------------------------
print(q.get())
print(q.get())
print(q.get())

五、后进先出队列

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())
 --------------------------
(1, 'ccccc')
(3, 'aaaaa')

七、双线队列

q = queue.deque()
q.append(123)
q.append(456)
q.appendleft(780)
print(q)
print(q.pop())
print(q.popleft())
-----------------------------
deque([780, 123, 456])

八、生产消费者模型

解决什么问题,使用场景
从下面图中可以发现生产者和消费者之间用中间类似一个队列一样的东西串起来。这个队列可以想像成一个存放产品的“仓库”,生产者只需要关心这个“仓库”,并不需要关心具体的消费者,对于生产者而言甚至都不知道有这些消费者存在。对于消费者而言他也不需要关心具体的生产者,到底有多少生产者也不是他关心的事情,他只要关心这个“仓库”中还有没有东西。这种模型是一种松耦合模型。这个模型的产生就是为了复用和解耦。比如常见的消息框架(非常经典的一种生产者消费者模型的使用场景)ActiveMQ。发送端和接收端用Topic进行关联。这个Topic可以理解为我们这里“仓库”的地址,这样就可以实现点对点和广播两种方式进行消息的分发。

  • 生产消费者模型图
    在这里插入图片描述
  • 一句话总结:解决程序解耦,较少的资源解决高并发的问题
import queue,threading,time
q=queue.Queue()
def product(arg):
    q.put(str(arg)+'包子')
def consumer(arg):
    print(arg,q.get())
for i in range(3):
    t=threading.Thread(target=product,args=(i,))
    t.start()
for j in range(3):
    t=threading.Thread(target=consumer,args=(j,))
    t.start()
				
文章目录主要作用队列与列表的关系分类FIFO (先入先出) 1、创建 queue队列对象 q = multiprocessing.Queue(3) # 3表示只能存放3个数据 参数 :maxsize是队列中允许的最大项数。如果省略此参数,则无大小限制。 返回值q 是队列对象 2. put()方法 ,向队列中存放数据。如果队列已满,此方法将阻塞至有空间可用为止。 3. get()返回q中的一个项目。...
队列模块实现多生产者、多消费者队列。当信息必须在多个线程之间安全地交换时,它在线程编程中特别有用。此模块中的Queue类实现所有必需的锁定语义。这取决于Python中线程支持的可用性;参见线程模块。 模块实现了三种类型的队列,它们只是在检索条目的顺序上有所不同。在FIFO队列中,第一个添加的任务是第一个检索到的任务。在后进先出队列中,最近添加的条目是第一个检索到的条目(像堆栈一样操作)。使用... from queue import Queue from queue import PriorityQueue print("Queue类实现了一个基本的先进先出(FIFO)容器,使用put()将元素添加到序列尾端,get()从队列尾部移除元素。\n") q = Queue() for i in range(3): q.put(i) whil...
queue — A synchronized queue class:https://docs.python.org/3/library/queue.html 菜鸟教程 - Python3 多线程:http://www.runoob.com/python3/python3-multithreading.html python3 队列:https://cloud.tencent.com/d...
Python中,队列是线程间最常用的交换数据的形式。Queue模块是提供队列操作的模块,虽然简单易用,但是不小心的话,还是会出现一些意外。 创建一个“队列”对象 import Queue q = Queue.Queue(maxsize = 10) Queue.Queue类即是一个队列的同步实现。队列长度可为无限或者有限。可通过Queue的构造函数的可选参数maxsize来设定队列长度。如果
Queue.qsize() 返回队列的大小  Queue.empty() 如果队列为空,返回True,反之False  Queue.full() 如果队列满了,返回True,反之False Queue.full 与 maxsize 大小对应  Queue.get([block[, timeout]])获取队列,timeout等待时间  Queue.get_nowait() 相当Queue
Queue - 一种线程安全的FIFO实现 PythonQueue模块提供一种适用于多线程编程的FIFO实现。它可用于在生产者(producer)和消费者(consumer)之间线程安全(thread-safe)地传递消息或其它数据,因此多个线程可以共用同一个Queue实例。Queue的大小(元素的个数)可用来限制内存的使用。 Basic FIFO Queue Queue类实现了一个基本的先进先...
#使用put方法往队列中添加元素,需要考虑是否能放下的问题 #如果放不下了,默认会阻塞(block=True),阻塞时可以定义超时时间(timeout=5) #可以使用block=False设置不阻塞立即报错 q.put(11) q.put(22) q.put(33) print(q.empty