一、Queue对象
1、Queue对象实现了多生产者/多消费者队列,尤其适合需要在多个线程之间进行信息交互的场合,实现了多线程编程锁需要的所有锁语义
2、Queue对象主要实现了put()和get()方法
3、put(item,block=True,timeout=None)用于往队列尾部追加元素
item: 需要放入队列尾部的元素
block: True队列满了就阻塞等队列有空位了再往末尾加入元素,False队列满了不阻塞直接返回
timeout: 超时时间
4、get(block=True,timeout=None)用于从队列头部获取并删除元素
block: True队列为空就阻塞等队列有元素了再去获取
timeout: 超时时间
二、Queue对象常用方法
1、Queue.qsize():返回当前队列包含的消息数量
2、Queue.empty() 如果队列为空,返回True,反之False
3、Queue.full() 如果队列满了,返回True,反之False
4、Queue.get()获取队列,timeout等待时间
5、Queue.put(item) 写入队列
6、Queue.get_nowait() 相当Queue.get(False)
7、Queue.put_nowait(item) 相当Queue.put(item, False)
8、Queue.task_done() 在完成一项工作之后,使用Queue.task_done()方法可以向队列发送一
个信号,表示该任务执行完毕
9、Queue.join() 实际上意味着等到队列中所有的任务(数据)执行完毕之后,再往下,否则一直
等待
注意点:join()是判断的依据,不单单指的是队列中没有数据,数据get出去之后,要使
用task_done()向队列发送一个信号,表示该任务执行(数据使用)完毕。
三、Queue队列分类
1、FIFO(先入先出)队列Queue
2、LIFO(后入先出)队列LifoQueue
3、优先级队列PriorityQueue:队列中的元素为元祖类型:(优先级,数据)
四、代码演示
1、FIFO(先入先出)队列Queue
from queue import Queue
myqueue = Queue(maxsize=3)
myqueue.put("消息1")
myqueue.put("消息2")
myqueue.put("消息3")
for i in range(myqueue.qsize()):
print(myqueue.get())
2、LIFO(后入先出)队列LifoQueue
from queue import LifoQueue
myqueue = LifoQueue(maxsize=3)
myqueue.put("消息1")
myqueue.put("消息2")
myqueue.put("消息3")
for i in range(myqueue.qsize()):
print(myqueue.get())
3、优先级队列PriorityQueue
传入一个元组,前面的数字为优先级,数字越小优先级越高,优先级高的先出队列
from queue import PriorityQueue
myqueue = PriorityQueue(maxsize=3)
myqueue.put((3,"消息1"))
myqueue.put((1,"消息2"))
myqueue.put((2,"消息3"))
for i in range(myqueue.qsize()):
print(myqueue.get())
五、应用举例
场景:生产者将骨头放到队列中,消费者(狗)从队列中去吃骨头
import threading
import random
from queue import Queue
class Produce(threading.Thread):
def __init__(self,myqueue:Queue):
super().__init__()
self.myqueue = myqueue
def run(self) -> None:
#队列为空就创建
while True:
if self.myqueue.empty():
#往队列中添加骨头
self.myqueue.put(item=random.randint(1,1000))
print(self.getName(),"生产骨头一个")
print("生产者中看到的队列长度为:", self.myqueue.qsize())
class Consumer(threading.Thread):
def __init__(self,myqueue:Queue):
super().__init__()
self.myqueue = myqueue
def run(self) -> None:
#队列不为空就消费
while True:
if not self.myqueue.empty():
#从队列中删除骨头
self.myqueue.get()
print(self.getName(), "消费骨头一个")
print("消费者中看到的队列长度为:",self.myqueue.qsize())
def done():
myqueue = Queue(maxsize=20)
for j in range(5):
produce = Produce(myqueue=myqueue)
produce.start()
for k in range(3):
consumer = Consumer(myqueue=myqueue)
consumer.start()
done()
欢迎来到testingpai.com!
注册 关于