Queue隊列類型
FIFO
FIFO即First in First Out,先進先出。Queue提供了一個基本的FIFO容器,使用方法很簡單,maxsize是個整數,指明了隊列中能存放的資料個數的上限。一旦達到上限,插入會導緻阻塞,直到隊列中的資料被消費掉。如果maxsize小于或者等于0,隊列大小沒有限制。
LIFO
LIFO即Last in First Out,後進先出。與棧的類似,使用也很簡單,maxsize用法同上
priority
構造一個優先隊列。maxsize用法同上
使用方法
方法 | 描述 |
---|---|
Queue.qsize() | 傳回隊列大小 |
Queue.empty() | 判斷隊列是否為空 |
Queue.full() | 判斷隊列是否滿了 |
Queue.get([block[,timeout]]) | 從隊列頭删除并傳回一個item,block預設為True,表示當隊列為空卻去get的時候會阻塞線程,等待直到有有item出現為止來get出這個item。如果是False的話表明當隊列為空你卻去get的時候,會引發異常。在block為True的情況下可以再設定timeout參數。表示當隊列為空,get阻塞timeout指定的秒數之後還沒有get到的話就引發Full異常。 |
Queue.put(…[,block[,timeout]]) | 向隊尾插入一個item,同樣若block=True的話隊列滿時就阻塞等待有空位出來再put,block=False時引發異常。同get的timeout,put的timeout是在block為True的時候進行逾時設定的參數。 |
Queue.task_done() | 從場景上來說,處理完一個get出來的item之後,調用task_done将向隊列發出一個信号,表示本任務已經完成。 |
Queue.join() | 監視所有item并阻塞主線程,直到所有item都調用了task_done之後主線程才繼續向下執行。這麼做的好處在于,假如一個線程開始處理最後一個任務,它從任務隊列中拿走最後一個任務,此時任務隊列就空了但最後那個線程還沒處理完。當調用了join之後,主線程就不會因為隊列空了而擅自結束,而是等待最後那個線程處理完成了。 |
生産者與消費者
import threading
from queue import Queue
import time
que = Queue(5)
l =[]
class Producter(threading.Thread):
def run(self):
global l,que
while True:
try:
v = l.pop(0)
que.put(v)
except IndexError:
print("{} exit".format(threading.current_thread()))
break
class Consumer(threading.Thread):
def run(self):
global que
while True:
if que.not_empty:
v = que.get()
time.sleep(0.5)
que.task_done()
print("{} begining {}".format(threading.current_thread(),v))
else:
print("{} exit".format(threading.current_thread()))
break
def main():
global que
p = Producter(name="生産者1")
p.setDaemon(True)
p.start()
for i in range(3):
c = Consumer(name="消費者{}".format(i))
c.setDaemon(True)# 設定為守護程序,主線程退出時,子程序也kill掉
c.start()
que.join()
if __name__ == '__main__':
for i in range(20):
l.append("music {}".format(i))
main()