Queue是python標準庫中的線程安全的隊列(FIFO)實現,提供了一個適用於多線程編程的先進先出的數據結構,即隊列,用來在生產者和消費者線程之間的信息傳遞python
class Queue.Queue(maxsize=0)編程
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()
輸出:多線程
0 1 2 3 4
class Queue.LifoQueue(maxsize=0)線程
LIFO即Last in First Out,後進先出。與棧的相似,使用也很簡單,maxsize用法同上code
再舉個栗子:對象
import Queue q = Queue.LifoQueue() for i in range(5): q.put(i) while not q.empty(): print q.get()
輸出:隊列
4 3 2 1 0
能夠看到僅僅是將Queue.Quenu類
替換爲Queue.LifiQueue類
進程
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()
結果
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放入隊列中。
其非阻塞版本爲put_nowait
等同於put(item, False)
從隊列中移除並返回一個數據。block跟timeout參數同put
方法
其非阻塞方法爲`get_nowait()`至關與get(False)
若是隊列爲空,返回True,反之返回False