python 多线程系列—Queue 对象 (五)

一、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()
1 回帖
请输入回帖内容 ...
  • AMuBai

    学废了学废了!!!666!!!