Python的Queue模塊中提供了同步的、線程安全的隊列類,包括:FIFO(先入先出)隊列QueueLIFO(后入先出)隊列LifoQueue,優(yōu)先級隊列PriorityQueue,這些隊列都實現(xiàn)了鎖道批,能夠在多線程中直接使用∪肴觯可以使用隊列來實現(xiàn)線程間的同步隆豹。初始化Queue()對象時(例如:q=Queue()),若括號中沒有指定最大可接收的消息數(shù)量茅逮,或數(shù)量為負值璃赡,那么就代表可接受的消息數(shù)量沒有上限。
一:隊列的方法
Queue.qsize():返回當前隊列包含的消息數(shù)量献雅;
Queue.empty() 如果隊列為空碉考,返回True,反之False
Queue.full() 如果隊列滿了,返回True,反之False
Queue.get()獲取隊列挺身,timeout等待時間
# 如果block表示是否等待侯谁,如果timeout表示是否等待,
get(self, block=True, timeout=None)
Queue.put(item) 寫入隊列
# 如果block表示是否等待章钾,如果timeout表示是否等待墙贱,
put(self, item, block=True, timeout=None)
from queue import Queue,LifoQueue,PriorityQueue
# 創(chuàng)建一個隊列對,3是maxsize參數(shù)叮姑,控制隊列長度
q = Queue(3)
# 往隊列中添加數(shù)據(jù)的方法:put
# 如果隊列已滿塞绿,則會進入堵塞狀態(tài)(等待)
# 參數(shù)block:如果隊列已滿是否等待;timeout:等待的超時時間
q.put("111")
q.put("222")
q.put("333")
# q.put("444")
# 獲取對列中數(shù)據(jù)的方法:get
# 如果隊列為空晓殊,則會進入堵塞狀態(tài)(等待)
# 參數(shù)block:如果隊列為空是否等待府寒;timeout:等待的超時時間
print("獲取對列里的數(shù)據(jù):",q.get())
q.put("444")
print("獲取對列里的數(shù)據(jù):",q.get())
print("獲取對列里的數(shù)據(jù):",q.get())
print("----end-----")
# full:判斷隊列是否已滿
print("隊列是否已滿:",q.full())
# empty:判斷隊列是否為空
print("隊列是否為空:",q.empty())
# 獲取隊列中的數(shù)據(jù)量
print("獲取隊列里的數(shù)據(jù)量:",q.qsize())
image.png
Queue.task_done() 在完成一項工作之后魁衙,使用Queue.task_done()方法可以向隊列發(fā)送一個信號,表示該任務執(zhí)行完畢
Queue.join() 實際上意味著等到隊列中所有的任務(數(shù)據(jù))執(zhí)行完畢之后株搔,再往下剖淀,否則一直等待
注意點:join()是判斷的依據(jù),不單單指的是隊列中沒有數(shù)據(jù)邪狞,數(shù)據(jù)get出去之后祷蝌,要使用task_done()向隊列發(fā)送一個信號,表示該任務執(zhí)行(數(shù)據(jù)使用)完畢
import time,random
from queue import Queue
from threading import Thread
q = Queue()
for i in range(10):
q.put("數(shù)據(jù){}".format(i))
def work(data):
"""
線程執(zhí)行的公眾函數(shù)
:param data:
:return:
"""
for i in range(1):
time.sleep(random.randint(1,3))
print("數(shù)據(jù)data:{}處理完畢".format(data))
# 給隊列發(fā)送一個信號帆卓,告訴對象這條數(shù)據(jù)處理完畢(執(zhí)行完了一個任務)
q.task_done()
def main():
"""使用隊列等待的方法"""
for i in range(10):
data = q.get()
t1 = Thread(target=work,args=(data,))
t1.start()
# 等待隊列中所有的任務執(zhí)行完畢(數(shù)據(jù)處理完畢)
q.join()
print("等待線程中所有的數(shù)據(jù)處理完畢再往下執(zhí)行---")
main()
二、后入先出隊列LifoQueue
from queue import Queue,LifoQueue,PriorityQueue
# ---------后入先出隊列-----------------------
# 創(chuàng)建一個后入先出隊列,3是maxsize參數(shù)米丘,控制隊列長度
q = LifoQueue(3)
# 往隊列中添加數(shù)據(jù)的方法:put
q.put("111")
q.put("222")
q.put("333")
# 獲取對列中數(shù)據(jù)的方法:get
print("獲取對列里的數(shù)據(jù):",q.get())
q.put("444")
print("獲取對列里的數(shù)據(jù):",q.get())
print("獲取對列里的數(shù)據(jù):",q.get())
image.png
三剑令、優(yōu)先級隊列:PriorityQueue
from queue import Queue,LifoQueue,PriorityQueue
q = PriorityQueue(3)
# 往隊列中添加數(shù)據(jù)的方法:put
# tuple第一個參數(shù)為優(yōu)先級,數(shù)值越小先出
q.put((99,"111"))
q.put((6,"222"))
q.put((28,"333"))
# 獲取對列中數(shù)據(jù)的方法:get
print("獲取對列里的數(shù)據(jù):",q.get())
print("獲取對列里的數(shù)據(jù):",q.get())
print("獲取對列里的數(shù)據(jù):",q.get())