栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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()
ps:一起学习,一起成长,有问题私信我。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1036524.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号