新聞中心
Python線程下queue隊(duì)列模塊的用法,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。
創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站建設(shè)、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的西寧網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
queue模塊實(shí)現(xiàn)了各種【多生產(chǎn)者-多消費(fèi)者】隊(duì)列??捎糜谠趫?zhí)行的多個(gè)線程之間安全的交換信息。
queue模塊定義了3種不同的隊(duì)列類(lèi)。
3種不同的隊(duì)列類(lèi)
q=Queue(maxsize):創(chuàng)建一個(gè)FIFO(first-in first-out,先進(jìn)先出)隊(duì)列。maxsize是隊(duì)列中金額以放入的項(xiàng)的最大數(shù)量。
如果省略maxsize參數(shù)或?qū)⑺脼?,隊(duì)列大小將無(wú)窮大。
q=LifoQueue(maxsize):創(chuàng)建一個(gè)LIFO(last-in first-out,后進(jìn)先出)隊(duì)列(棧)。
q=PriorityQueue(maxsize):創(chuàng)建一個(gè)優(yōu)先級(jí)隊(duì)列,其中項(xiàng)按照優(yōu)先級(jí)從低到高依次排好。
使用這種隊(duì)列時(shí),項(xiàng)應(yīng)該是(priority,data)形式的元組,其中priority時(shí)一個(gè)標(biāo)識(shí)優(yōu)先級(jí)的數(shù)字。
常用方法
q.size():返回隊(duì)列的正確大小。因?yàn)槠渌€程可能正在更新此隊(duì)列,所以此方法的返回?cái)?shù)字不可靠。
q.empty():如果隊(duì)列為空,返回True,否則返回False。
q.full():如果隊(duì)列已滿,返回True,否則返回False。
q.put(item,block,timeout):將item放入隊(duì)列。
如果block設(shè)為T(mén)rue(默認(rèn)值),調(diào)用者將被阻塞直到隊(duì)列中出現(xiàn)可用的空閑位置為止。
如果block設(shè)為False,隊(duì)列滿時(shí)此方法將引發(fā)Full異常。
q.put_nowait(item):等價(jià)于q.put(item,False)
q.get(block,timeout):從隊(duì)列中刪除一項(xiàng),然后返回這個(gè)項(xiàng)。
如果block設(shè)為T(mén)rue(默認(rèn)值),調(diào)用者將阻塞,直到隊(duì)列中出現(xiàn)可用的空閑為止。
如果block設(shè)為False,隊(duì)列為空時(shí)將引發(fā)Empty異常。
timeout提供可選的超時(shí)值,單位為秒,如果超時(shí),將引發(fā)Empty異常。
q.get_nowait():等價(jià)于get(0)
q.task_done():在隊(duì)列種數(shù)據(jù)的消費(fèi)者用來(lái)指示對(duì)于項(xiàng)的處理已經(jīng)結(jié)束。如果使用此方法,那么從隊(duì)列中刪除的每一項(xiàng)都應(yīng)該調(diào)用一次。
q.join():阻塞直到隊(duì)列中的所有項(xiàng)均被刪除和處理為止。一旦為隊(duì)列中的每一項(xiàng)都調(diào)用了一次q.task_done()方法,此方法將會(huì)直接返回。
實(shí)例:
使用 隊(duì)列一般可以簡(jiǎn)化多線程的程序。例如,可以使用共享隊(duì)列將線程連接在一起,而不必依賴鎖的保護(hù)。
在這種模型下,工作者線程一般充當(dāng)數(shù)據(jù)的消費(fèi)者。
from threading import Thread
from queue import Queue
class WorkerThread(Thread):
def __init__(self,*args,**kwargs):
Thread.__init__(self,*args,**kwargs)
self.input_queue=Queue()
def send(self,item):
self.input_queue.put(item)
def close(self):
self.input_queue.put(None)
self.input_queue.join()
def run(self):
while True:
item=self.input_queue.get()
if item is None:
break
#實(shí)際開(kāi)發(fā)中,此處應(yīng)該使用有用的工作代替
print(item)
self.input_queue.task_done()
#完成,指示收到和返回哨兵
self.input_queue.task_done()
return
if __name__=="__main__":
w=WorkerThread()
w.start()
w.send("學(xué)")
w.send("步")
w.send("園")
w.send("網(wǎng)")
w.close()
運(yùn)行結(jié)果:
學(xué)
步
園
網(wǎng)
關(guān)于Python線程下queue隊(duì)列模塊的用法問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。
網(wǎng)頁(yè)標(biāo)題:Python線程下queue隊(duì)列模塊的用法
文章路徑:http://fisionsoft.com.cn/article/pcojgd.html