国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python Queue模塊詳細(xì)介紹及實(shí)例

2019-11-25 16:26:13
字體:
供稿:網(wǎng)友

Python Queue模塊

Python中,隊(duì)列是線程間最常用的交換數(shù)據(jù)的形式。Queue模塊是提供隊(duì)列操作的模塊,雖然簡單易用,但是不小心的話,還是會(huì)出現(xiàn)一些意外。

創(chuàng)建一個(gè)“隊(duì)列”對(duì)象

import Queueq = Queue.Queue(maxsize = 10)

Queue.Queue類即是一個(gè)隊(duì)列的同步實(shí)現(xiàn)。隊(duì)列長度可為無限或者有限。可通過Queue的構(gòu)造函數(shù)的可選參數(shù)maxsize來設(shè)定隊(duì)列長度。如果maxsize小于1就表示隊(duì)列長度無限。

將一個(gè)值放入隊(duì)列中

q.put(10)

調(diào)用隊(duì)列對(duì)象的put()方法在隊(duì)尾插入一個(gè)項(xiàng)目。put()有兩個(gè)參數(shù),第一個(gè)item為必需的,為插入項(xiàng)目的值;第二個(gè)block為可選參數(shù),默認(rèn)為1。如果隊(duì)列當(dāng)前為空且block為1,put()方法就使調(diào)用線程暫停,直到空出一個(gè)數(shù)據(jù)單元。如果block為0,put方法將引發(fā)Full異常。

將一個(gè)值從隊(duì)列中取出

q.get()

調(diào)用隊(duì)列對(duì)象的get()方法從隊(duì)頭刪除并返回一個(gè)項(xiàng)目。可選參數(shù)為block,默認(rèn)為True。如果隊(duì)列為空且block為True,get()就使調(diào)用線程暫停,直至有項(xiàng)目可用。如果隊(duì)列為空且block為False,隊(duì)列將引發(fā)Empty異常。

Python Queue模塊有三種隊(duì)列及構(gòu)造函數(shù):

1、Python Queue模塊的FIFO隊(duì)列先進(jìn)先出。     class Queue.Queue(maxsize)
2、LIFO類似于堆,即先進(jìn)后出。                         class Queue.LifoQueue(maxsize)
3、還有一種是優(yōu)先級(jí)隊(duì)列級(jí)別越低越先出來。    class Queue.PriorityQueue(maxsize)

此包中的常用方法(q = Queue.Queue()):

q.qsize() 返回隊(duì)列的大小q.empty() 如果隊(duì)列為空,返回True,反之Falseq.full() 如果隊(duì)列滿了,返回True,反之Falseq.full 與 maxsize 大小對(duì)應(yīng)q.get([block[, timeout]]) 獲取隊(duì)列,timeout等待時(shí)間q.get_nowait() 相當(dāng)q.get(False)非阻塞 q.put(item) 寫入隊(duì)列,timeout等待時(shí)間q.put_nowait(item) 相當(dāng)q.put(item, False)q.task_done() 在完成一項(xiàng)工作之后,q.task_done() 函數(shù)向任務(wù)已經(jīng)完成的隊(duì)列發(fā)送一個(gè)信號(hào)q.join() 實(shí)際上意味著等到隊(duì)列為空,再執(zhí)行別的操作

范例:

實(shí)現(xiàn)一個(gè)線程不斷生成一個(gè)隨機(jī)數(shù)到一個(gè)隊(duì)列中(考慮使用Queue這個(gè)模塊)

實(shí)現(xiàn)一個(gè)線程從上面的隊(duì)列里面不斷的取出奇數(shù)

實(shí)現(xiàn)另外一個(gè)線程從上面的隊(duì)列里面不斷取出偶數(shù)

#!/usr/bin/env python#coding:utf8import random,threading,timefrom Queue import Queue#Producer threadclass 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):  #隨機(jī)產(chǎn)生10個(gè)數(shù)字 ,可以修改為任意大小      randomnum=random.randint(1,99)      print "%s: %s is producing %d to the queue!" % (time.ctime(), self.getName(), randomnum)      self.data.put(randomnum) #將數(shù)據(jù)依次存入隊(duì)列      time.sleep(1)    print "%s: %s finished!" %(time.ctime(), self.getName()) #Consumer threadclass 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是超時(shí)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秒 就報(bào)異常        print "%s: %s finished!" %(time.ctime(),self.getName())        breakclass 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 threaddef 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()

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 玉田县| 五原县| 三河市| 石河子市| 秦皇岛市| 子洲县| 北京市| 安阳市| 松滋市| 诏安县| 昌乐县| 沁水县| 乌鲁木齐县| 巨野县| 庄河市| 上思县| 衡东县| 葫芦岛市| 宝鸡市| 岳池县| 酒泉市| 肃北| 中卫市| 商都县| 芒康县| 天门市| 六盘水市| 城步| 沅陵县| 泸溪县| 瓦房店市| 玛多县| 玉屏| 页游| 武鸣县| 黄石市| 寿阳县| 利辛县| 曲靖市| 沽源县| 团风县|