queque学习

queue模块实现了多生产者、多消费者队列。当必须在多个线程之间安全地交换信息时,它在线程编程中特别有用,实现了所有必需的锁定语义。

一、该模块实现了三种类型的队列,它们的区别仅在于检索条目的顺序:

    1、FIFO 队列,其添加的第一个任务是第一个检索的任务。

    2、LIFO 队列,其最近添加的条目是第一个检索的(像堆栈一样运行)。

    3、Priority 队列,其条目将保持排序,并首先检索最低值的条目。

二、该模块定义了以下类和异常:

  class  Queue.Queue(maxsize = 0 )
    FIFO队列的构造函数。 maxsize是一个整数,用于设置可以放入队列的项目数的上限。达到此大小后,插入将阻止,直到消耗队列项。如果 maxsize小于或等于零,则队列大小为无限大。
  class Queue.LifoQueue(maxsize = 0 )
    LIFO队列的构造函数。 maxsize是一个整数,用于设置可以放入队列的项目数的上限。达到此大小后,插入将阻止,直到消耗队列项。如果 maxsize小于或等于零,则队列大小为无限大。
  class Queue.PriorityQueue(maxsize = 0 )
    Priority队列的构造函数。 maxsize是一个整数,用于设置可以放入队列的项目数的上限。达到此大小后,插入将阻止,直到消耗队列项。如果 maxsize小于或等于零,则队列大小为无限大。
  exception Queue.Empty
    在queue对象为空时调用非阻塞 get()或 get_nowait()时引发异常。
  exception Queue.Full
    在queue对象已满时调用非阻塞 put()或 put_nowait()时引发异常。

三、queue对象提供下面描述的公共方法:

  Queue.qsize()    
    返回队列的大小。    
  Queue.empty()    
    如果队列为空则返回True,否则返回False(仅限当前,不保证后续情况)。    
  Queue.full()    
    如果队列已满则返回True,否则返回False(仅限当前,不保证后续情况)。
  Queue.put(item [,block [,timeout ] ] )
    将item放入队列。如果可选参数block为true 且 timeout为None,则在必要时阻止,直到有空闲槽可用。如果 timeout是一个正数,它会阻止最大超时时间,如果在该时间内没有可用的空闲槽,则会引发Full异常。
    反之(block为false),如果有空闲槽可以立即使用,则将item放入队列,否则引发Full异常(在这种情况下忽略超时)。
  Queue.put_nowait(item) 
    相当于 put(item, False)。
  Queue.get([ block [,timeout ] ] ) 
    从队列中删除并返回一个item。 如果可选的args块为true且timeout为None(默认值),则在必要时阻止,直到某个项可用为止。 如果timeout是一个正数,它会阻止最多超时秒,如果在该时间内没有可用的项,则会引发Empty异常。
    反之(block为false),如果有item可以立即使用,则返回该tem,否则引发Empty异常(在这种情况下忽略超时)。
  Queue.get_nowait()
    相当于 get(False)。

四、queue对象还提供了两种方法来支持跟踪守护进程、消费者线程是否已完全处理入队任务:

  Queue.task_done()
   表示之前队列的任务已完成。由队列消费者线程使用。对于用于获取任务的每个get(),对task_done()的后续调用会告知队列该任务的处理已完成。
   如果join() 当前正阻塞,则它将在所有条目都已处理后恢复(这意味着已为每个已放入队列的条目收到task_done()调用)。
   如果调用的次数超过队列中放置的条目,则引发ValueError。

  Queue.join()
   阻止直到队列中的所有条目都已获取并处理完毕。
   每当条目添加到队列时,未完成任务的计数就会增加。每当消费者线程调用task_done()以指示该条目已被检索并且其上的所有工作都已完成时,计数就会下降。当未完成任务的数量降至零时,join()取消阻止。

基本使用例子:

import queue

q = queue.Queue(2)
q.put('a')
q.put('b')
print(q.full())       # True
print(q.qsize())      # 2
print(q.queue[0])       # 获取队列的第1位元素 : a
print(q.queue)          # 打印队列内容 : deque(['a','b'])
print(q.get())        # a
print(q.get())        # b
print(q.empty())     # True

创建队列priority 优先级模式  用的不多

put的时候输入优先级级别和数据

import queue

q = queue.PriorityQueue()
q.put([1, "hello"])
q.put([3,"la"])
q.put([2,"Niu"])
q.put([1,"world"])
while not q.empty():
    print(q.get())

队列的原理:

class queue(object):
    """队列"""
    def __init__(self):
        self.__list=[]
    def enqueue(self,item):
        """入队"""
        self.__list.append(item)
    def dequeue(self):
        """出队"""
        return self.__list.pop(0)
    def is_empty(self):
        """判断是否为空"""
        return self.__list==[]
    def size(self):
        """判断大小"""
        return len(self.__list)
if __name__=="__main__":
    s=queue()
    s.enqueue(1)
    s.enqueue(2)
    s.enqueue(3)
    s.enqueue(4)
    print(s.dequeue())
    print(s.size())
    print(s.dequeue())
    print(s.dequeue())
    print(s.dequeue())
    print(s.is_empty())

 

posted @ 2022-10-09 23:28  Einewhaw  阅读(417)  评论(0编辑  收藏  举报