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()
執行結果: