1. 程式人生 > >python實戰之Queue佇列模組

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命令

[[email protected] 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()
[[email protected] 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()

執行結果: