Python 佇列Queue和PriorityQueue
阿新 • • 發佈:2019-01-05
Python的Queue模組適用於多執行緒程式設計的FIFO實現。它可用於在生產者(producer)和消費者(consumer)之間執行緒安全(thread-safe)地傳遞訊息或其它資料,因此多個執行緒可以共用同一個Queue例項。
FIFO: First in, First out.先進先出
LIFO: Last in, First out.後進先出
from queue import Queue#先進先出佇列
from queue import PriorityQueue#優先順序佇列
import time
#佇列:先進先出
q = Queue()#建立一個空佇列,佇列大小沒有指定
#判斷佇列是是否為空
#當一個佇列為空的時候如果再用get 取則會堵塞,所以取佇列的時候一般是用到
#get_nowait()方法,這種方法在向一個空佇列取值的時候會拋一個Empty異常
#所以更常用的方法是先判斷一個佇列是否為空,如果不為空則取值
print(q.empty())
#佇列的操作:存--put() 取--get()
q.put('page1')
q.put('page2')
q.put('page3')
print(q.empty())
#判斷佇列是否已經滿了
print(q.full())
q1 = Queue(3)#在建立佇列時,指定佇列大小(表示該佇列最多能存多少個元素)
q1.put('1')
q1.put('1')
q1. put('1')
print(q1.full())
q2 = Queue(3)
q2.put('1')
q2.put('2')
q2.put('3')
value = q2.get()#遵循的原則是:先進先出
print(value)
print(q2.full())
#存資料---阻塞
q3 = Queue(3)
q3.put(1)
q3.put(2)
q3.put(3)
# q3.put(4)#如果佇列已經滿了,等著(阻塞),一直等到佇列騰出空間,然後把值存入到隊列當中。
#取資料--阻塞
q4 = Queue(3)
q4.put(1)
value = q4.get()#1,此時佇列為空
print ('q4:',value)
# value = q4.get()#阻塞,直到隊列當中有新值的時候,取出,結束阻塞。
#非阻塞
q5 = Queue(3)
q5.put(1)
#1.取
print('q5.qsize:',q5.qsize())#當前隊列當中的元素個數
#方法1:
# while not q5.empty():
# value2 = q5.get(block=False)#block為Ture,表示阻塞,否則為非阻塞。非阻塞就是“強取”
# print('q5:',value2)
#方法2:
while q5.qsize()>0:
value2 = q5.get(block=False)
print('q5:',value2)
print('q5.qsize:',q5.qsize())
#存
q6 = Queue(3)
#方法1:
# print(q6.maxsize)#得到佇列最大容量
# i = 0
# while i<q6.maxsize:
# q6.put(i)
# i+=1
#方法2:
while not q6.full():
q6.put(1,block=False)#非阻塞
'''------------------------------其它的屬性和方法-----------------------------'''
q7 = Queue(3)
# q7.get(block=False)
print(time.time())
try:
q7.get(timeout=2)#阻塞時長
except:
pass
print(time.time())
q8 = Queue(3)
# q8.get_nowait()#強取
'''------------------------------優先順序佇列-----------------------------'''
q = PriorityQueue()
# 格式:q.put((數字,值))
#特點:數字越小,優先順序越高
q.put((1,'lori'))
q.put((-1,'Jseon'))
q.put((10,'King'))
i = 0
while i<q.qsize():
print(q.get())