python學習之佇列(Queue)

2021-07-25 21:52:11 字數 2002 閱讀 8439

佇列模組是繼承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 是乙個適用於高併發場景下的佇列,通過無鎖的方式,實現...