python queue队列
生活随笔
收集整理的這篇文章主要介紹了
python queue队列
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
作用:
解耦:使程序直接實現松耦合,修改一個函數,不會有串聯關系。
提高處理效率:FIFO = 現進先出,LIFO = 后入先出。
?
隊列:
隊列可以并發的派多個線程,對排列的線程處理,并切每個需要處理線程只需要將請求的數據放入隊列容器的內存中,線程不需要等待,當排列完畢處理完數據后,線程在準時來取數據即可。請求數據的線程只與這個隊列容器存在關系,處理數據的線程down掉不會影響到請求數據的線程,隊列會派給其他線程處理這分數據,它實現了解耦,提高效率。隊列內會有一個有順序的容器,列表與這個容器是有區別的,列表中數據雖然是排列的,但數據被取走后還會保留,而隊列中這個容器的數據被取后將不會保留。當必須在多個線程之間安全地交換信息時,隊列在線程編程中特別有用。
1、隊列有順序的容器
2、隊列數據只有一份,取出來就沒了
3、隊列數據放在內存里
?
Python三種類型的隊例:
Queue:FIFO 即first in first out 先進先出 LifoQueue:LIFO 即last in first out 后進先出 PriorityQueue:優先隊列,級別越低,越優先參數介紹:
# 先入先出 maxsize 可設置大小,設置block=False拋異常 class queue.Queue(maxsize=0) # 后進先出 class queue.LifoQueue(maxsize=0)# 存儲數據時可設置優先級的隊列 # 優先級設置數越小等級越高 class queue.PriorityQueue(maxsize=0) # 放入數據 Queue.put(item, block=True, timeout=None)# 取出數據 #沒有數據將會等待 Queue.get(block=True, timeout=None)# 如果1秒后沒取到數據就退出 Queue.get(timeout = 1)# 取數據,如果沒數據拋queue.Empty異常 Queue.get_nowait()# 查看隊列大小 Queue.qsize()# 返回True,如果空 Queue.empty() #return True if empty # 設置隊列大小 Queue.full() # 后續調用告訴隊列,任務的處理是完整的。 Queue.task_done()#print(q.get())#取不到會一直等著,卡著了 #print(q.get(timeout=5))#取不到卡5s,拋出異常 #print(q.get(block=True))#取不到會一直等著,卡著了 #print(q.get(block=False))#取不到會拋異常 #print(q.get_nowait())#取不到拋異常 隊列的幾種類型實例:import queue,time,threading q=queue.Queue()#先入先出,默認未限制大小 q=queue.Queue(maxsize=3)#可存入3個數 q.put('王荔1')#存數據,如果存滿了一直卡著 q.put('王荔2') q.put('王荔3') print("當前隊列剩余%s個"%(q.qsize()))#查當前隊列大小 print(q.get()) print(q.get()) print(q.get()) print("當前隊列剩余%s個"%(q.qsize()))#先入后出 q=queue.LifoQueue()#先入后出 q.put(1) q.put(2) q.put(3) print("當前隊列剩余%s個"%(q.qsize())) print(q.get()) print(q.get()) print(q.get()) print("當前隊列剩余%s個"%(q.qsize()))#可設置優先取出 q=queue.PriorityQueue() q.put((-1,"王荔")) q.put((2,"橙子")) q.put((3,"橙汁")) print("當前隊列剩余%s個"%(q.qsize())) print(q.get()) print(q.get()) print(q.get()) print("當前隊列剩余%s個"%(q.qsize()))C:\Users\wangli\PycharmProjects\AutoMation\venv\Scripts\python.exe C:/Users/wangli/PycharmProjects/AutoMation/case/test.py 當前隊列剩余3個 王荔1 王荔2 王荔3 當前隊列剩余0個 當前隊列剩余3個 3 2 1 當前隊列剩余0個 當前隊列剩余3個 (-1, '王荔') (2, '橙子') (3, '橙汁') 當前隊列剩余0個Process finished with exit code 0?
?
#生產者與消費者模型實例:import threading,time import queue q = queue.Queue(maxsize=10) def Producer(name):count = 1while True:q.put("骨頭%s" % count)print("生產了骨頭",count)count +=1time.sleep(0.1) def Consumer(name):while True:print("[%s] 取到[%s] 并且吃了它..." %(name, q.get()))time.sleep(1) p = threading.Thread(target=Producer,args=("Alex",)) c = threading.Thread(target=Consumer,args=("ChengRonghua",)) c1 = threading.Thread(target=Consumer,args=("王森",)) p.start() c.start() c1.start()C:\Users\wangli\PycharmProjects\AutoMation\venv\Scripts\python.exe C:/Users/wangli/PycharmProjects/AutoMation/case/test.py 生產了骨頭 1 [ChengRonghua] 取到[骨頭1] 并且吃了它... 生產了骨頭 2 [王森] 取到[骨頭2] 并且吃了它... 生產了骨頭 3 生產了骨頭 4 生產了骨頭 5 生產了骨頭 6 生產了骨頭 7 生產了骨頭 8 生產了骨頭 9 生產了骨頭 10 [ChengRonghua] 取到[骨頭3] 并且吃了它... 生產了骨頭 11 [王森] 取到[骨頭4] 并且吃了它... 生產了骨頭 12 生產了骨頭 13 生產了骨頭 14 [ChengRonghua] 取到[骨頭5] 并且吃了它... 生產了骨頭 15 [王森] 取到[骨頭6] 并且吃了它... 生產了骨頭 16 [ChengRonghua] 取到[骨頭7] 并且吃了它... 生產了骨頭 17 [王森] 取到[骨頭8] 并且吃了它... 生產了骨頭 18Process finished with exit code -1?
總結
以上是生活随笔為你收集整理的python queue队列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 构建测试的体系化思维(进阶篇)
- 下一篇: Python Pytest前置setup