溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python線程下queue隊列模塊的用法

發(fā)布時間:2021-10-13 15:49:07 來源:億速云 閱讀:269 作者:柒染 欄目:編程語言

Python線程下queue隊列模塊的用法,針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

  queue模塊實(shí)現(xiàn)了各種【多生產(chǎn)者-多消費(fèi)者】隊列??捎糜谠趫?zhí)行的多個線程之間安全的交換信息。

  queue模塊定義了3種不同的隊列類。

  3種不同的隊列類

  q=Queue(maxsize):創(chuàng)建一個FIFO(first-in first-out,先進(jìn)先出)隊列。maxsize是隊列中金額以放入的項(xiàng)的最大數(shù)量。

  如果省略maxsize參數(shù)或?qū)⑺脼?,隊列大小將無窮大。

  q=LifoQueue(maxsize):創(chuàng)建一個LIFO(last-in first-out,后進(jìn)先出)隊列(棧)。

  q=PriorityQueue(maxsize):創(chuàng)建一個優(yōu)先級隊列,其中項(xiàng)按照優(yōu)先級從低到高依次排好。

  使用這種隊列時,項(xiàng)應(yīng)該是(priority,data)形式的元組,其中priority時一個標(biāo)識優(yōu)先級的數(shù)字。

  常用方法

  q.size():返回隊列的正確大小。因?yàn)槠渌€程可能正在更新此隊列,所以此方法的返回數(shù)字不可靠。

  q.empty():如果隊列為空,返回True,否則返回False。

  q.full():如果隊列已滿,返回True,否則返回False。

  q.put(item,block,timeout):將item放入隊列。

  如果block設(shè)為True(默認(rèn)值),調(diào)用者將被阻塞直到隊列中出現(xiàn)可用的空閑位置為止。

  如果block設(shè)為False,隊列滿時此方法將引發(fā)Full異常。

  q.put_nowait(item):等價于q.put(item,False)

  q.get(block,timeout):從隊列中刪除一項(xiàng),然后返回這個項(xiàng)。

  如果block設(shè)為True(默認(rèn)值),調(diào)用者將阻塞,直到隊列中出現(xiàn)可用的空閑為止。

  如果block設(shè)為False,隊列為空時將引發(fā)Empty異常。

  timeout提供可選的超時值,單位為秒,如果超時,將引發(fā)Empty異常。

  q.get_nowait():等價于get(0)

  q.task_done():在隊列種數(shù)據(jù)的消費(fèi)者用來指示對于項(xiàng)的處理已經(jīng)結(jié)束。如果使用此方法,那么從隊列中刪除的每一項(xiàng)都應(yīng)該調(diào)用一次。

  q.join():阻塞直到隊列中的所有項(xiàng)均被刪除和處理為止。一旦為隊列中的每一項(xiàng)都調(diào)用了一次q.task_done()方法,此方法將會直接返回。

  實(shí)例:

  使用 隊列一般可以簡化多線程的程序。例如,可以使用共享隊列將線程連接在一起,而不必依賴鎖的保護(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í)際開發(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隊列模塊的用法問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI