Python的queue模組詳解

巴扎黑
發布: 2017-07-19 13:16:57
原創
2308 人瀏覽過

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()
登入後複製

 

#輸出:

01
2
3
4
登入後複製

 

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()
登入後複製

 
輸出:

#
4
3
2
10
登入後複製

 可以看到僅僅是將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 job
Job: level 10 job
Job: 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]])

  1. 將item放入佇列中。

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

  3. 如果timeout是個正整數,阻塞呼叫程序最多timeout秒,如果一直無空空間可用,拋出Full異常(帶超時的阻塞呼叫)。

如果block為False,如果有空閒空間可用將資料放入佇列,否則立即拋出Full例外

其非阻斷版本為put_nowait

等同於

put(item, False)

get([block[, timeout]])

#從佇列中移除並傳回一個資料。 block跟timeout參數同

put方法

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

get(False)

#empty() ######若佇列為空,則回傳True,反之回傳False#####

以上是Python的queue模組詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!