您好,登錄后才能下訂單哦!
Python線程下queue隊列模塊的用法,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
queue模塊實現了各種【多生產者-多消費者】隊列。可用于在執行的多個線程之間安全的交換信息。
queue模塊定義了3種不同的隊列類。
3種不同的隊列類
q=Queue(maxsize):創建一個FIFO(first-in first-out,先進先出)隊列。maxsize是隊列中金額以放入的項的最大數量。
如果省略maxsize參數或將它置為0,隊列大小將無窮大。
q=LifoQueue(maxsize):創建一個LIFO(last-in first-out,后進先出)隊列(棧)。
q=PriorityQueue(maxsize):創建一個優先級隊列,其中項按照優先級從低到高依次排好。
使用這種隊列時,項應該是(priority,data)形式的元組,其中priority時一個標識優先級的數字。
常用方法
q.size():返回隊列的正確大小。因為其他線程可能正在更新此隊列,所以此方法的返回數字不可靠。
q.empty():如果隊列為空,返回True,否則返回False。
q.full():如果隊列已滿,返回True,否則返回False。
q.put(item,block,timeout):將item放入隊列。
如果block設為True(默認值),調用者將被阻塞直到隊列中出現可用的空閑位置為止。
如果block設為False,隊列滿時此方法將引發Full異常。
q.put_nowait(item):等價于q.put(item,False)
q.get(block,timeout):從隊列中刪除一項,然后返回這個項。
如果block設為True(默認值),調用者將阻塞,直到隊列中出現可用的空閑為止。
如果block設為False,隊列為空時將引發Empty異常。
timeout提供可選的超時值,單位為秒,如果超時,將引發Empty異常。
q.get_nowait():等價于get(0)
q.task_done():在隊列種數據的消費者用來指示對于項的處理已經結束。如果使用此方法,那么從隊列中刪除的每一項都應該調用一次。
q.join():阻塞直到隊列中的所有項均被刪除和處理為止。一旦為隊列中的每一項都調用了一次q.task_done()方法,此方法將會直接返回。
實例:
使用 隊列一般可以簡化多線程的程序。例如,可以使用共享隊列將線程連接在一起,而不必依賴鎖的保護。
在這種模型下,工作者線程一般充當數據的消費者。
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
#實際開發中,此處應該使用有用的工作代替
print(item)
self.input_queue.task_done()
#完成,指示收到和返回哨兵
self.input_queue.task_done()
return
if __name__=="__main__":
w=WorkerThread()
w.start()
w.send("學")
w.send("步")
w.send("園")
w.send("網")
w.close()
運行結果:
學
步
園
網
關于Python線程下queue隊列模塊的用法問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。