# -*- coding: UTF-8 -*- # 一:class queue.Queue(maxsize=0) # 先入先出 # 创建一个“队列”对象 # import Queue # q = Queue.Queue(maxsize = 10) # Queue.Queue类即是一个队列的同步实现。队列长度可为无限或者有限。可通过Queue的构造函数的可选参数maxsize来设定队列长度。如果maxsize小于1就表示队列长度无限。 # # 将一个值放入队列中 # q.put(10) # 调用队列对象的put()方法在队尾插入一个项目。put()有两个参数,第一个item为必需的,为插入项目的值;第二个block为可选参数,默认为 # 1。如果队列当前为空且block为1,put()方法就使调用线程暂停,直到空出一个数据单元。如果block为0,put方法将引发Full异常。 # # 将一个值从队列中取出 # q.get() # 调用队列对象的get()方法从队头删除并返回一个项目。可选参数为block,默认为True。如果队列为空且block为True, # get()就使调用线程暂停,直至有项目可用。如果队列为空且block为False,队列将引发Empty异常。 # # Python Queue模块有三种队列及构造函数: # 1、Python Queue模块的FIFO队列先进先出。 class queue.Queue(maxsize) # 2、LIFO类似于堆,即先进后出。 class queue.LifoQueue(maxsize) # 3、还有一种是优先级队列级别越低越先出来。 class queue.PriorityQueue(maxsize) # # 此包中的常用方法(q = Queue.Queue()): # q.qsize() 返回队列的大小 # q.empty() 如果队列为空,返回True,反之False # q.full() 如果队列满了,返回True,反之False # q.full 与 maxsize 大小对应 # q.get([block[, timeout]]) 获取队列,timeout等待时间 # q.get_nowait() 相当q.get(False) # 非阻塞 q.put(item) 写入队列,timeout等待时间 # q.put_nowait(item) 相当q.put(item, False) # q.task_done() 在完成一项工作之后,q.task_done() 函数向任务已经完成的队列发送一个信号 # q.join() 实际上意味着等到队列为空,再执行别的操作 >>> import queue >>> q = queue.Queue() >>> q.put("1") #put往队列里插入数据 >>> q.put("2") >>> q.put("3") >>> q.qsize() #qsize 获取队列大小 3 >>> q.get() #get取出队列数据 '1' >>> q.get() '2' >>> q.get() '3' >>> q.get() #当没有数据的时候会卡主 ... ... >>> q.get_nowait()#当没有数据使用此方法会抛出异常,可以通过捕捉异常来处理 Traceback (most recent call last): File "", line 1, in File "/usr/local/python3/lib/python3.5/queue.py", line 192, in get_nowait return self.get(block=False) File "/usr/local/python3/lib/python3.5/queue.py", line 161, in get raise Empty queue.Empty >>> q.get(block=False) #设置参数,当没有数据的时候,抛出一行和 q.get_nowait()效果一样 Traceback (most recent call last): File "", line 1, in File "/usr/local/python3/lib/python3.5/queue.py", line 161, in get raise Empty queue.Empty >>> q.get(timeout = 3) #设置卡多久、3秒后抛出异常 Traceback (most recent call last): File "", line 1, in File "/usr/local/python3/lib/python3.5/queue.py", line 172, in get raise Empty queue.Empty #---------------------------- >>> q = queue.Queue(maxsize=3) #设置队列大小 >>> q.put(1) >>> q.put(2) >>> q.put(2) >>> q.put(2) #第四个数据的时候会卡主,只有前面的数据被消费了才会被放入队列 .. ............ Queue.put(item, block=True, timeout=None) >>> q.put(2,timeout=3) #和get一样、当队列满了的时候,设置超时时间时,放不进去数据,就抛出异常 Traceback (most recent call last): File "", line 1, in File "/usr/local/python3/lib/python3.5/queue.py", line 141, in put raise Full queue.Full >>> q.put(2,block=False) #当队列满了的时候,如果block设为False就不会等待,而是直接抛出异常 Traceback (most recent call last): File "", line 1, in File "/usr/local/python3/lib/python3.5/queue.py", line 130, in put raise Full queue.Full # 二 class queue.LifoQueue(maxsize=0) # 最后一个放到队列的,先被消费 # 特殊情况下需要 >>> q = queue.LifoQueue() #last in fisrt out >>> q.put(1) >>> q.put(2) >>> q.put(3) >>> q.get() 3 >>> q.get() 2 >>> q.get() 1 # 三 :class queue.PriorityQueue(maxsize=0) # 存储数据时可设置优先级的队列 # 以元祖的第1列排序,如果是字符串,就是abc 如果是数字,就是 -1 1 2 3 >>> q = queue.PriorityQueue() >>> q.put((-1,"Lin")) >>> q.put((10,"Yao")) >>> q.put((3,"Hong")) >>> q.put((11,"Linyaohong")) >>> q.get() (-1, 'Lin') >>> q.get() (3, 'Hong') >>> q.get() (10, 'Yao') >>> q.get() (11, 'Linyaohong') >>> q.get()