python实战之Queue队列模块

queue队列 

Python自带的queue队列 模块

作用:1.解耦2.提高效率 

进程Queue本身就封装了序列化和反序列化的两个过程

3种队列模式

class queue.Queue(maxsize=0) #先入先出

class queue.LifoQueue(maxsize=0) #last in fisrt out 后进先出

class queue.PriorityQueue(maxsize=0) #存储数据时可设置优先级的队列

 

q = queue.Queue()#生成队列容器(先进先出)

q = queue.Queue(maxsize=3)#生成队列容器允许3个数据存放(先进先出)

 

q = queue.LifoQueue()#生成队列容器(后进先出)

a = queue.LifoQueue(maxsize=3) #生成队列容器允许3个数据存放(后进先出)

 

q = queue.PriorityQueue()#生成队列容器(设置优先级数字越小越先出)

q.put((xx,"yy")) # xx为优先级数字 yy为数据

a = queue.PriorityQueue(maxsize=4)# #生成队列容器允许3个数据存放(设置优先级数字越小越先出)

 

q.put(1) #把1该数据放入队列中

q.put_nowait(4)#如果该队列容易满了就异常提示满了

q.put(4,timeout=1) #如果队列容器满了超时1秒异常出现提示满了

q.put(4,block=False)# q.put(4,block=False)==q.put_nowait(4)

q.get()#取出队列里的数据(安装默认先存进去先出来的原理)如果没数据会进入卡住等待

q.get_nowait()#取出队列里的数据 #当队列容器里面没有数据,会出现一个异常提示队列容器是空的

q.get(block=False)# q.get(block=False) == q.get_nowait()

q.qsize()#查看队列数量,也可以判断如果q.qsize的数量为0就不取了

q.get(timeout=1)  #当没有数据可以取的时候 卡住1秒就出异常提示队列空了

 

实战Queue命令

[root@python Part_nine]# py
Python 3.5.4 (default, Oct  4 2017, 05:41:45) 
>>> import queue#导入队列模块
>>> q = queue.Queue()#生成队列容器 
>>> q.put("d1")#把d1该数据放入队列中
>>> q.put("d2")#把d2该数据放入队列中
>>> q.put("d3")#把d3该数据放入队列中
>>> q.qsize()#查看队列数量
3
>>> q.get()#取出队列里的数据(安装默认先存进去先出来的原理)
'd1'
>>> q.get()
'd2'
>>> q.get()
'd3'
>>> q.get()#如果队列没有数据就卡住(就是在等数据进来)

如果你不想卡住,还想干其他的事情取数据的时候使用q.get_nowait()
[root@python Part_nine]# py
>>> import queue#导入队列模块
>>> q = queue.Queue()#生成队列容器
>>> q.put(1) #把1该数据放入队列中
>>> q.put(2) #把2该数据放入队列中
>>> q.put(3) #把3该数据放入队列中
>>> q.get_nowait()#取出队列里的数据(安装默认先存进去先出来的原理)
1
>>> q.get_nowait()
2
>>> q.get_nowait()
3 
>>> q.get_nowait()#当队列容器里面没有数据,会出现一个异常提示队列容器是空的
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.5/queue.py", line 192, in get_nowait
    return self.get(block=False)
  File "/usr/local/lib/python3.5/queue.py", line 161, in get
    raise Empty
queue.Empty

>>> q.qsize()  #也可以判断如果q.qsize的数量为0就不取了   
0
>>> q.get(block=False)  # q.get(block=False) = q.get_nowait()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.5/queue.py", line 161, in get
    raise Empty
queue.Empty

>>> q.get(timeout=1)  #当没有数据可以取的时候 卡住1秒就出异常提示队列空了
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.5/queue.py", line 172, in get
    raise Empty
queue.Empty

>>> q = queue.Queue(maxsize=3) #生成队列容器允许3个数据存放
>>> q.put(1)
>>> q.put(2)
>>> q.put(2)
>>> q.put(3)	#放第4个就会卡住

如果不想卡住的话就使用put_nowait 和timeout
>>> import queue
>>> q = queue.Queue(maxsize=3)
>>> q.put_nowait(1) #如果该队列容易满了就异常提示满了
>>> q.put_nowait(2)
>>> q.put_nowait(3)
>>> q.put_nowait(4)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.5/queue.py", line 184, in put_nowait
    return self.put(item, block=False)
  File "/usr/local/lib/python3.5/queue.py", line 130, in put
    raise Full
queue.Full
>>> q.put(4,timeout=1) #如果队列容器满了超时1秒异常出现提示满了
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.5/queue.py", line 141, in put
    raise Full
queue.Full
>>> q.put(4,block=False)# q.put(4,block=False)==q.put_nowait(4) 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.5/queue.py", line 130, in put
    raise Full
queue.Full

先进先出模式(queue.Queue(maxsize=0)):

__author__ = "Burgess Zheng"

import queue  #python3是小写的  python2 是大写的Queue
#CLASS queue.Queue(MAXSIZE=0) #先进先出

'''
q = queue.Queue()
q.put(1)
q.put(2)
q.put(3)
print(q.get())
print(q.get())
print(q.get())
print(q.qsize())
'''

a = queue.Queue(maxsize=3)
a.put(1)
a.put(2)
a.put(3)
print(a.qsize())#查看队列数量,也可以判断如果q.qsize的数量为0就不取了
#q.put(1)#会卡住
#a.put_nowait(1)#如果该队列容易满了就异常提示满了
#a.put(4,timeout=1)#如果队列容器满了超时1秒异常出现提示满了
#a.put(4,block=False)# q.put(4,block=False)==q.put_nowait(4)
print(a.get())
print(a.get())
print(a.get())
#a.get()卡住
#a.get_nowait()#取出队列里的数据 #当队列容器里面没有数据,会出现一个异常提示队列容器是空的
#a.get(block=False)# q.get(block=False) == q.get_nowait()
#a.get(timeout=1) #当没有数据可以取的时候 卡住1秒就出异常提示队列空了

执行结果:

后进先出模式(queue.LifoQueue()):

__author__ = "Burgess Zheng"

import queue  #python3是小写的  python2 是大写的Queue
#CLASS queue.LifoQueue(MAXSIZE=0) #后进先出

'''
q = queue.LifoQueue()
q.put(1)
q.put(2)
q.put(3)
print(q.get())
print(q.get())
print(q.get())
print(q.qsize())
'''

a = queue.LifoQueue(maxsize=3)
a.put(1)
a.put(2)
a.put(3)
print(a.qsize())#查看队列数量,也可以判断如果q.qsize的数量为0就不取了
#q.put(1)#会卡住
#a.put_nowait(1)#如果该队列容易满了就异常提示满了
#a.put(4,timeout=1)#如果队列容器满了超时1秒异常出现提示满了
#a.put(4,block=False)# q.put(4,block=False)==q.put_nowait(4)
print(a.get())
print(a.get())
print(a.get())
#a.get()卡住
#a.get_nowait()#取出队列里的数据 #当队列容器里面没有数据,会出现一个异常提示队列容器是空的
#a.get(block=False)# q.get(block=False) == q.get_nowait()
#a.get(timeout=1) #当没有数据可以取的时候 卡住1秒就出异常提示队列空

执行结果

优先级小的先出( queue.PriorityQueue())

__author__ = "Burgess Zheng"

import queue  #python3是小写的  python2 是大写的Queue
#CLASS queue.PriorityQueue(MAXSIZE=0) #数字越小越优先

'''
q = queue.PriorityQueue()
q.put((-1,"cristal"))
q.put((3,"son"))
q.put((10,"burgess"))
q.put((6,"daughter"))
print(q.get())
print(q.get())
print(q.get())
print(q.get())
print(q.qsize())
'''


a = queue.PriorityQueue(maxsize=4)
a.put((-1,"cristal"))
a.put((3,"son"))
a.put((10,"burgess"))
a.put((6,"daughter"))
print(a.qsize())#查看队列数量,也可以判断如果q.qsize的数量为0就不取了
#q.put(1)#会卡住
#a.put_nowait(1)#如果该队列容易满了就异常提示满了
#a.put(4,timeout=1)#如果队列容器满了超时1秒异常出现提示满了
#a.put(4,block=False)# q.put(4,block=False)==q.put_nowait(4)
print(a.get())
print(a.get())
print(a.get())
print(a.get())
#a.get()卡住
#a.get_nowait()#取出队列里的数据 #当队列容器里面没有数据,会出现一个异常提示队列容器是空的
#a.get(block=False)# q.get(block=False) == q.get_nowait()
#a.get(timeout=1) #当没有数据可以取的时候 卡住1秒就出异常提示队列空了

执行结果

使用queue实现生产消费模式

__author__ = "Burgess Zheng"
import threading,time

import queue

q = queue.Queue(maxsize=10)#生成队列容器最多10个排队
def Producer(name):#生产者
    count = 1
    while True:#循环
        q.put("骨头%s" %count)#追加数据到队列
        print("生产了骨头",count)
        count += 1#由于队列容器只有10位置,所以到了第10个自然就停止.
        time.sleep(0.1)

def Consumer(name):#消费者
    #while q.qsize()>0:
        #当队列容器里的数据数量大于0
        #出现了问题是 如果生产慢的话,突然队列空了,消费就停止执行了
    while True:#所以用while True
        print("[%s]取到[%s] 并且吃了它..." %(name,q.get()))
        time.sleep(1)
        #某某开始取队列的值先进先取并且吃了他

p = threading.Thread(target=Producer,args=("Burgess",))#实例化线程
c = threading.Thread(target=Consumer,args=("XiaoMing",))#实例化线程
c1 = threading.Thread(target=Consumer,args=("XiaoQiang",))#实例化线程
p.start()
c.start()
c1.start()

执行结果:

猜你喜欢

转载自blog.csdn.net/Burgess_zheng/article/details/85838542
今日推荐