說(shuō)明:
隊(duì)列:
隊(duì)列類(lèi)似一條管道厦画,元素put(進(jìn))疮茄,get(出)
隊(duì)列都是在內(nèi)存中操作滥朱,進(jìn)程退出,隊(duì)列情況力试,且隊(duì)列是阻塞形態(tài)隊(duì)列分類(lèi):
python隊(duì)列依賴Queue模塊
隊(duì)列 | 方式 |
---|---|
Queue.Queue | 先進(jìn)先出 |
Queue.LifoQueue | 后進(jìn)先出 |
queue.PriorityQueue | 優(yōu)先級(jí)隊(duì)列 |
queue.deque | 雙線隊(duì)列 |
- 隊(duì)列方法:
方法 | 說(shuō)明 |
---|---|
put | 往隊(duì)列中寫(xiě)入數(shù)據(jù)徙邻,默認(rèn)有block=True和timeout兩個(gè)參數(shù)。當(dāng)block=True時(shí)畸裳,寫(xiě)入是阻塞式的缰犁,阻塞時(shí)間由timeout確定。當(dāng)隊(duì)列q被(其他線程)寫(xiě)滿后怖糊,這段代碼就會(huì)阻塞民鼓,直至其他線程取走數(shù)據(jù)。Queue.put()方法加上 block=False 的參數(shù)蓬抄,即可解決這個(gè)隱蔽的問(wèn)題丰嘉。但要注意,非阻塞方式寫(xiě)隊(duì)列嚷缭,當(dāng)隊(duì)列滿時(shí)會(huì)拋出 exception Queue.Full 的異常 |
get | 取數(shù)據(jù)(默認(rèn)阻塞),Queue.get([block[, timeout]])獲取隊(duì)列饮亏,timeout等待時(shí)間 |
empty | 如果隊(duì)列為空,返回True,反之False |
qsize | 顯示隊(duì)列中真實(shí)存在的元素長(zhǎng)度 |
maxsize | 最大支持的隊(duì)列長(zhǎng)度,使用時(shí)無(wú)括號(hào) |
join | 等到隊(duì)列為空阅爽,再執(zhí)行別的操作 |
task_done | 在完成一項(xiàng)工作之后路幸,Queue.task_done()函數(shù)向任務(wù)已經(jīng)完成的隊(duì)列發(fā)送一個(gè)信號(hào) |
full | 如果隊(duì)列滿了,返回True,反之False |
生產(chǎn)消費(fèi)模型
用隊(duì)列將生產(chǎn)者和消費(fèi)者串起來(lái)付翁,使他們無(wú)需知道對(duì)方狀態(tài)简肴,只需要往隊(duì)列中放或取數(shù)據(jù),解決程序解耦
import threading
import Queue
import time
import random
#設(shè)置隊(duì)列長(zhǎng)度為5
q = Queue.Queue(5)
#定義生產(chǎn)者
def Producer(name):
for i in range(20):
q.put(i)
print "Producer %s put %s"(name,i)
time.sleep(random.randrange(4))
#定義消費(fèi)者
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()