首頁  >  文章  >  後端開發  >  Python Queue模組

Python Queue模組

不言
不言原創
2018-04-09 17:31:292330瀏覽

這篇文章主要介紹了Python Queue模組,現在分享給大家,需要的朋友可以參考下

Python中,隊列是線程間最常用的交換資料的形式。 Queue模組是提供佇列操作的模組,雖然簡單易用,但不小心的話,還是會出現一些意外。

建立一個「佇列」物件
import Queue
q = Queue.Queue(maxsize = 10)
Queue.Queue類別即是一個隊列的同步實作。隊列長度可為無限或有限。可透過Queue的建構函數的可選參數maxsize來設定佇列長度。如果maxsize小於1就表示佇列長度無限。

將一個值放入佇列中
q.put(10)
呼叫佇列物件的put()方法在隊尾插入一個專案. put()有兩個參數,第一個item為必需的,為插入項目的值;第二個block為可選參數,預設為
1。如果佇列目前為空且block為1,put()方法就使呼叫執行緒暫停,直到空出一個資料單元。如果block為0,put方法將引發Full異常。

將一個值從佇列中取出
q.get()
呼叫佇列物件的get()方法從隊頭刪除並傳回一個項目。可選參數為block,預設為True。如果佇列為空且block為True,get()就使呼叫執行緒暫停,直到有項目可用。如果佇列為空且block為False,佇列將引發Empty異常。

Python Queue模組有三種佇列及建構子:
#1、Python Queue模組的FIFO佇列先進先出。 class Queue.Queue(maxsize)
2、LIFO類似堆,即先進後出。 class Queue.LifoQueue(maxsize)
3、還有一種是優先權佇列等級越低越先出來。 class Queue.PriorityQueue(maxsize)

此套件中的常用方法(q = Queue.Queue()):
q.qsize() 傳回佇列的大小
q.empty() 如果佇列為空,則回傳True,反之False
q.full() 若佇列滿了,則回傳True,反之False
q.full 與maxsize 大小對應
q.get([block[, timeout]]) 取得佇列,timeout等待時間
q.get_nowait() 相當q.get(False)
非阻塞q.put(item) 寫入佇列, timeout等待時間
q.put_nowait(item) 相當q.put(item, False)
q.task_done() 在完成一項工作之後,q.task_done() 函數向任務已經完成的隊列發送一個訊號
q.join() 其實是指等到佇列為空,再執行別的操作

#範例:##實作一個執行緒不斷產生一個隨機數到一個隊列中(考慮使用Queue這個模組)
實作一個執行緒從上面的佇列裡面不斷的取出奇數
實作另外一個執行緒從上面的佇列裡面不斷取出偶數

#!/usr/bin/env python
#coding:utf8
import random,threading,time
from Queue import Queue
#Producer thread
class Producer(threading.Thread):
  def __init__(self, t_name, queue):
    threading.Thread.__init__(self,name=t_name)
    self.data=queue
  def run(self):
    for i in range(10):  #随机产生10个数字 ,可以修改为任意大小
      randomnum=random.randint(1,99)
      print "%s: %s is producing %d to the queue!" % (time.ctime(), self.getName(), randomnum)
      self.data.put(randomnum) #将数据依次存入队列
      time.sleep(1)
    print "%s: %s finished!" %(time.ctime(), self.getName())
 
#Consumer thread
class Consumer_even(threading.Thread):
  def __init__(self,t_name,queue):
    threading.Thread.__init__(self,name=t_name)
    self.data=queue
  def run(self):
    while 1:
      try:
        val_even = self.data.get(1,5) #get(self, block=True, timeout=None) ,1就是阻塞等待,5是超时5秒
        if val_even%2==0:
          print "%s: %s is consuming. %d in the queue is consumed!" % (time.ctime(),self.getName(),val_even)
          time.sleep(2)
        else:
          self.data.put(val_even)
          time.sleep(2)
      except:   #等待输入,超过5秒 就报异常
        print "%s: %s finished!" %(time.ctime(),self.getName())
        break
class Consumer_odd(threading.Thread):
  def __init__(self,t_name,queue):
    threading.Thread.__init__(self, name=t_name)
    self.data=queue
  def run(self):
    while 1:
      try:
        val_odd = self.data.get(1,5)
        if val_odd%2!=0:
          print "%s: %s is consuming. %d in the queue is consumed!" % (time.ctime(), self.getName(), val_odd)
          time.sleep(2)
        else:
          self.data.put(val_odd)
          time.sleep(2)
      except:
        print "%s: %s finished!" % (time.ctime(), self.getName())
        break
#Main thread
def main():
  queue = Queue()
  producer = Producer('Pro.', queue)
  consumer_even = Consumer_even('Con_even.', queue)
  consumer_odd = Consumer_odd('Con_odd.',queue)
  producer.start()
  consumer_even.start()
  consumer_odd.start()
  producer.join()
  consumer_even.join()
  consumer_odd.join()
  print 'All threads terminate!'
 
if __name__ == '__main__':
  main()

                       

######################

以上是Python Queue模組的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn