Python模塊-Queue隊列

Introduction:

  • queue是python中的標準庫,俗稱隊列,可直接import使用
  • 隊列(queue)為一種數據結構,用於存儲數據(類似列表及字典)
  • 列表及字典不適合用於多線程中使用,在多個線程中,數據是共享的,進行數據交換的時候,不能夠保證數據的安全性和一致性,我們希望多個線程不要執行同一個任務,但使用列表或是字典就容易發生不同線程取到同一組數據或是執行同一個任務的詬病
  • 隊列可以完美解決線程間的數據交換,保證線程間數據的安全性和一致性

Types:

  1. 先存入的數據會最先被取出(先進先出,FIFO)class queue.Queue(maxsize)
  2. 後存入的數據會最先被取出(後進先出,LIFO)class queue.LifoQueue(maxsize)
  3. 優先級隊列,级别越低越先出来class queue.PriorityQueue(maxsize)

Usage:

創建隊列物件

1
2
import queue
q_obj = queue.Queue(maxsize)

maxsize 填入可存儲數據的長度,若不填入則為無限大

插入數據

將數據寫入隊列queue.put(item,block,timeout)

  • block決定是否等待堵塞,預設為True
  • timeout為等待時間
1
2
3
q_obj.put('data')
q_obj.put('data1')
q_obj.put('data2')

要是輸入的數據超過maxsize的限定值,預設會等待阻塞(block=1),要是將block手動設為0且又超過maxsize的限定值將會報錯並提示隊列已滿

  • q_obj.put('data',False)相當於q_obj.put_nowait()

拿取數據

使用get拿取隊列中的數據queue.get(item,block,timeout)

1
print(q_obj.get())
1
data
1
print(q_obj.get())
1
data1
1
print(q_obj.get())
1
data2

要是queue物件中已無存儲的數據仍進行拿取(get),預設會等待阻塞(block=1),要是將block手動設為0執意拿取空隊列中的數據將會報錯並提示隊列已空

  • q_obj.get(False)相當於q_obj.get_nowait()

返回當前隊列的大小

1
q_obj.qsize()

如果隊列滿了,返回True,反之False

(queue.full 與 maxsize 大小對應)

1
q_obj.full()

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

1
q_obj.empty()

在完成工作之後,queue.task_done函數向任務已經完成的隊列發送一個信號

1
q_obj.task_done()

等到隊列為空,再執行別的操作

1
q_obj.join()

Reference:

http://www.cnblogs.com/CongZhang/p/5274486.html
http://python3-cookbook.readthedocs.io/zh_CN/latest/c12/p03_communicating_between_threads.html