專欄地址:每週一個 Python 模塊html
Queue 是 Python 標準庫中的線程安全的隊列(FIFO)實現,提供了一個適用於多線程編程的先進先出的數據結構,即隊列,用來在生產者和消費者線程之間的信息傳遞。python
有一點須要注意,Python2 中模塊名是 Queue,而 Python3 是 queue。git
class Queue.Queue(maxsize=0)github
FIFO 即 First in First Out,先進先出。Queue 提供了一個基本的 FIFO 容器,使用方法很簡單,maxsize 是個整數,指明瞭隊列中能存放的數據個數的上限。一旦達到上限,插入會致使阻塞,直到隊列中的數據被消費掉。若是maxsize 小於或者等於 0,隊列大小沒有限制。編程
舉個栗子:安全
import Queue
q = Queue.Queue()
for i in range(5):
q.put(i)
while not q.empty():
print q.get()
# output
# 0
# 1
# 2
# 3
# 4
複製代碼
class Queue.LifoQueue(maxsize=0)數據結構
LIFO 即 Last in First Out,後進先出。與棧的相似,使用也很簡單,maxsize 用法同上。多線程
再舉個栗子:spa
import Queue
q = Queue.LifoQueue()
for i in range(5):
q.put(i)
while not q.empty():
print q.get()
# output
# 4
# 3
# 2
# 1
# 0
複製代碼
能夠看到僅僅是將Queue.Quenu
類替換爲Queue.LifoQueue
類。線程
class Queue.PriorityQueue(maxsize=0)
構造一個優先隊列。maxsize 用法同上。
import Queue
import threading
class Job(object):
def __init__(self, priority, description):
self.priority = priority
self.description = description
print 'Job:',description
return
def __cmp__(self, other):
return cmp(self.priority, other.priority)
q = Queue.PriorityQueue()
q.put(Job(3, 'level 3 job'))
q.put(Job(10, 'level 10 job'))
q.put(Job(1, 'level 1 job'))
def process_job(q):
while True:
next_job = q.get()
print 'for:', next_job.description
q.task_done()
workers = [threading.Thread(target=process_job, args=(q,)),
threading.Thread(target=process_job, args=(q,))
]
for w in workers:
w.setDaemon(True)
w.start()
q.join()
# output
# Job: level 3 job
# Job: level 10 job
# Job: level 1 job
# for: level 1 job
# for: level 3 job
# for: job: level 10 job
複製代碼
意味着以前入隊的一個任務已經完成。由隊列的消費者線程調用。每個 get()
調用獲得一個任務,接下來的 task_done()
調用告訴隊列該任務已經處理完畢。
若是當前一個join()
正在阻塞,它將在隊列中的全部任務都處理完時恢復執行(即每個由put()
調用入隊的任務都有一個對應的task_done()
調用)。
阻塞調用線程,直到隊列中的全部任務被處理掉。
只要有數據被加入隊列,未完成的任務數就會增長。當消費者線程調用task_done()
(意味着有消費者取得任務並完成任務),未完成的任務數就會減小。當未完成的任務數降到 0,join()
解除阻塞。
將item
放入隊列中。
block
爲True
且timeout
爲空對象(默認的狀況,阻塞調用,無超時)。timeout
是個正整數,阻塞調用進程最多timeout
秒,若是一直無空空間可用,拋出Full
異常(帶超時的阻塞調用)。block
爲False
,若是有空閒空間可用將數據放入隊列,不然當即拋出Full
異常。其非阻塞版本爲put_nowait
等同於put(item, False)
。
從隊列中移除並返回一個數據。block
跟timeout
參數同put
方法。其非阻塞方法爲get_nowait()
至關與get(False)
。
若是隊列爲空,返回True
,反之返回False
。
相關文檔: