• 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())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    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())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    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())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    五、应用举例

    场景:生产者将骨头放到队列中,消费者(狗)从队列中去吃骨头

    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    ps:一起学习,一起成长,有问题私信我。
  • 相关阅读:
    Docker Hub
    十一届财经峰会,群硕凭借掌汇云荣获数字化先锋产品奖
    Redis缓存的使用
    lora训练之偷师
    【Audio】正弦波生成原理及C++代码
    KMP算法——通俗易懂讲好KMP算法:实例图解分析+详细代码注解 --》你的所有疑惑在本文都能得到解答
    深度访谈丨工作13年的程序员老兵,当初为何选择Java?现在后悔吗?
    STM32状态机编程----什么是状态机?
    51单片机 串口通信
    【如何看待Unity收费】对标中小公司的待就业者的该如何做
  • 原文地址:https://blog.csdn.net/weixin_54542209/article/details/126177394