Queue
Queue是python標準庫中的線程安全的隊列(FIFO)實現,提供了一個適用于多線程編程的先進先出的數據結構,即隊列,用來在生產者和消費者線程之間的信息傳遞
基本FIFO隊列
classQueue.Queue(maxsize=0)
FIFO即FirstinFirstOut,先進先出。Queue提供了一個基本的FIFO容器,使用方法很簡單,maxsize是個整數,指明了隊列中能存放的數據個數的上限。一旦達到上限,插入會導致阻塞,直到隊列中的數據被消費掉。如果maxsize小于或者等于0,隊列大小沒有限制。
舉個栗子:
importQueue
q=Queue.Queue()
foriinrange(5):
q.put(i)
whilenotq.empty():
printq.get()
輸出:
0
1
2
3
4
LIFO隊列
classQueue.LifoQueue(maxsize=0)
LIFO即LastinFirstOut,后進先出。與棧的類似,使用也很簡單,maxsize用法同上
再舉個栗子:
importQueue
q=Queue.LifoQueue()
foriinrange(5):
q.put(i)
whilenotq.empty():
printq.get()
輸出:
4
3
2
1
0
可以看到僅僅是將Queue.Quenu類替換為Queue.LifiQueue類
優先級隊列
classQueue.PriorityQueue(maxsize=0)
構造一個優先隊列。maxsize用法同上。
importQueue
importthreading
classJob(object):
def__init__(self,priority,description):
self.priority=priority
self.description=description
print'Job:',description
return
def__cmp__(self,other):
returncmp(self.priority,other.priority)
q=Queue.PriorityQueue()
q.put(Job(3,'level3job'))
q.put(Job(10,'level10job'))
q.put(Job(1,'level1job'))
defprocess_job(q):
whileTrue:
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,))
]
forwinworkers:
w.setDaemon(True)
w.start()
q.join()
結果
Job:level3job
Job:level10job
Job:level1job
for:level1job
for:level3job
for:job:level10job
一些常用方法
task_done()
意味著之前入隊的一個任務已經完成。由隊列的消費者線程調用。每一個get()調用得到一個任務,接下來的task_done()調用告訴隊列該任務已經處理完畢。
如果當前一個join()正在阻塞,它將在隊列中的所有任務都處理完時恢復執行(即每一個由put()調用入隊的任務都有一個對應的task_done()調用)。
join()
阻塞調用線程,直到隊列中的所有任務被處理掉。
只要有數據被加入隊列,未完成的任務數就會增加。當消費者線程調用task_done()(意味著有消費者取得任務并完成任務),未完成的任務數就會減少。當未完成的任務數降到0,join()解除阻塞。
put(item[,block[,timeout]])
將item放入隊列中。
如果可選的參數block為True且timeout為空對象(默認的情況,阻塞調用,無超時)。
如果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,希望對大家有所幫助,如果想要了解更多Python相關知識,請關注IT培訓機構:千鋒教育。http://www.dietsnews.net/