說明:
隊列:
隊列類似一條管道,元素put(進),get(出)
隊列都是在內存中操作,進程退出,隊列情況,且隊列是阻塞形態隊列分類:
python隊列依賴Queue模塊
隊列 | 方式 |
---|---|
Queue.Queue | 先進先出 |
Queue.LifoQueue | 后進先出 |
queue.PriorityQueue | 優先級隊列 |
queue.deque | 雙線隊列 |
- 隊列方法:
方法 | 說明 |
---|---|
put | 往隊列中寫入數據,默認有block=True和timeout兩個參數。當block=True時,寫入是阻塞式的,阻塞時間由timeout確定。當隊列q被(其他線程)寫滿后,這段代碼就會阻塞,直至其他線程取走數據。Queue.put()方法加上 block=False 的參數,即可解決這個隱蔽的問題。但要注意,非阻塞方式寫隊列,當隊列滿時會拋出 exception Queue.Full 的異常 |
get | 取數據(默認阻塞),Queue.get([block[, timeout]])獲取隊列,timeout等待時間 |
empty | 如果隊列為空,返回True,反之False |
qsize | 顯示隊列中真實存在的元素長度 |
maxsize | 最大支持的隊列長度,使用時無括號 |
join | 等到隊列為空,再執行別的操作 |
task_done | 在完成一項工作之后,Queue.task_done()函數向任務已經完成的隊列發送一個信號 |
full | 如果隊列滿了,返回True,反之False |
生產消費模型
用隊列將生產者和消費者串起來,使他們無需知道對方狀態,只需要往隊列中放或取數據,解決程序解耦
import threading
import Queue
import time
import random
#設置隊列長度為5
q = Queue.Queue(5)
#定義生產者
def Producer(name):
for i in range(20):
q.put(i)
print "Producer %s put %s"(name,i)
time.sleep(random.randrange(4))
#定義消費者
def Consumer(name):
while True:
data = q.get()
print "Consumer %s get %s"(name,i)
time.sleep(random.randrange(3))
p = threading.Thread(target=Producer,args=("jack",))
c = threading.Thread(target=Consumer,args=("yang",))
p.start()
c.start()