Python的queue模組詳解

來源:互聯網
上載者:User

Queue

Queue是python標準庫中的安全執行緒的隊列(FIFO)實現,提供了一個適用於多線程編程的先進先出的資料結構,即隊列,用來在生產者和消費者線程之間的資訊傳遞

基本FIFO隊列

class Queue.Queue(maxsize=0)

FIFO即First in First Out,先進先出。Queue提供了一個基本的FIFO容器,使用方法很簡單,maxsize是個整數,指明了隊列中能存放的資料個數的上限。一旦達到上限,插入會導致阻塞,直到隊列中的資料被消費掉。如果maxsize小於或者等於0,隊列大小沒有限制。

舉個栗子:

1 import Queue2 3 q = Queue.Queue()4 5 for i in range(5):6     q.put(i)7 8 while not q.empty():9     print q.get()

輸出:

01234

LIFO隊列

class Queue.LifoQueue(maxsize=0)

LIFO即Last in First Out,後進先出。與棧的類似,使用也很簡單,maxsize用法同上

再舉個栗子:

1 import Queue2 3 q = Queue.LifoQueue()4 5 for i in range(5):6     q.put(i)7 8 while not q.empty():9     print q.get()

輸出:

43210

可以看到僅僅是將Queue.Quenu類替換為Queue.LifiQueue類

優先順序隊列

class Queue.PriorityQueue(maxsize=0)

構造一個優先隊列。maxsize用法同上。

import Queueimport threadingclass Job(object):def __init__(self, priority, description):        self.priority = priority        self.description = descriptionprint 'Job:',descriptionreturndef __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 jobJob: level 10 jobJob: level 1 jobfor: level 1 jobfor: level 3 jobfor: job: level 10 job

一些常用方法

task_done()

意味著之前入隊的一個任務已經完成。由隊列的消費者線程調用。每一個get()調用得到一個任務,接下來的task_done()調用告訴隊列該任務已經處理完畢。

如果當前一個join()正在阻塞,它將在隊列中的所有任務都處理完時恢複執行(即每一個由put()調用入隊的任務都有一個對應的task_done()調用)。

join()

阻塞調用線程,直到隊列中的所有任務被處理掉。

只要有資料被排入佇列,未完成的任務數就會增加。當消費者線程調用task_done()(意味著有消費者取得任務並完成任務),未完成的任務數就會減少。當未完成的任務數降到0,join()解除阻塞。

put(item[, block[, timeout]])

將item放入隊列中。

  1. 如果可選的參數block為True且timeout為空白對象(預設的情況,阻塞調用,無逾時)。

  2. 如果timeout是個正整數,阻塞調用進程最多timeout秒,如果一直無空空間可用,拋出Full異常(帶逾時的阻塞調用)。

  3. 如果block為False,如果有空閑空間可用將資料放入隊列,否則立即拋出Full異常

其非阻塞版本為put_nowait等同於put(item, False)

get([block[, timeout]])

從隊列中移除並返回一個資料。block跟timeout參數同put方法

其非阻塞方法為`get_nowait()`相當與get(False)

empty()

如果隊列為空白,返回True,反之返回False

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.