佇列模組是繼承multi-producer,multi-consumer queues。它經常被用作處理執行緒操作,比如要進行多執行緒之間通訊時。
佇列有三種型別,這種不同體現在檢索順序上。這三種分別為fifo佇列、lifo佇列(它更像我們所說的棧)和優先順序佇列。fifo佇列是先進先出;lifo佇列是後進先出;優先順序佇列是依據元素用優先順序的大小排序,然後採用先進先出的原則。他們的容器大小依據放置在容器內元素的數量而定。
以下給出使用的例子:
fifo佇列:
q = queue.queue()
for i in range(5):
q.put(i)
while not q.empty():
print q.get()
執行結果:
lifo佇列:
q = queue.lifoqueue()
for i in range(5):
q.put(i)
while not q.empty():
print q.get()
執行結果:
優先順序佇列:
class students:
def __init__(self, name, age, id):
self.name = name
self.age = age
self.id = id
def __cmp__(self, other):
return cmp(self.id, other.id);
q = queue.priorityqueue()
q.put(students('mcc', 19, 9))
q.put(students('ccm', 18, 5))
q.put(students('cmc', 16, 8))
while not q.empty():
student = q.get()
print '姓名: %s 年齡: %s 學號:%s'%(student.name, student.age, student.id)
執行結果:
最後介紹一些常用的方法
task_done():
表示之前的入隊的任務已經完成。由佇列的消費者呼叫。每乙個get()呼叫乙個任務,接下來的task_done()呼叫告訴佇列該任務己經處理完成。如果當乙個join()正在阻塞,它將在佇列中所有任務執行完畢後呼叫執行,每乙個put()呼叫入隊任務都有乙個對應的task_done()呼叫。
join()
阻塞呼叫執行緒,直到佇列中所有任務被處理掉。只要還有資料未入隊,未完成的數量就會增加。當消費者執行緒呼叫task_done(),就意味者消費者的任務完成,未完的數目就會減少。當未完成數量減少到0時,阻塞解除。
put(item[,block[,timeout]])
將item放入佇列中。如果可選引數為block為true且timeout為空的物件時,預設情況為阻塞呼叫,無超時。timeout代表阻塞呼叫程序的時間,如果一直無空空間可用,就丟擲full異常。如果block為false,如果有空閒空間可用講資料放入佇列,否則立即丟擲full異常。它的非阻塞版本為put_nowait()方法。
get(block[block[,timeout]])
從佇列中移除並返回乙個資料。block以及timeout引數同put方法相同。它的非阻塞版本為get_nowait()方法。
empty()
如果隊列為空,返回true,反之返回false。
python之《棧stack和佇列queue》
棧和佇列是兩種常用的,重要的資料結構。棧和佇列是限定插入和刪除只能在表的 端點 進行的線性表。棧 特點 後進先出 1,建立棧 借助列表 stack list print stack 2,判斷是否為空棧 stack list print stack if not stack print 為空棧 els...
python之佇列學習
列表list雖然訪問速度很快,但是當資料比較多的時候,查詢和刪除資料的效率就會變的很低,這時候可以使用deque deque 是雙端列表,即兩端都可以進行插入和刪除操作 from collections import deque 建立乙個空的佇列 q deque python3也可以這樣寫 q co...
concurrent包下的容器之Queue
併發queue 在併發佇列上jdk提供了兩套實現 乙個是以concurrentlinkedqueue為代表的高效能佇列,乙個是以blockingqueue介面為代表的阻塞佇列 這兩種都繼承自 queue concurrentlinkedqueue 是乙個適用於高併發場景下的佇列,通過無鎖的方式,實現...